Clipper On Line • Ver Tópico - Usando tabelas dBase com PHP

Usando tabelas dBase com PHP

Discussão sobre outras linguagens de programação.

Moderador: Moderadores

 

Usando tabelas dBase com PHP

Mensagempor cjp » 22 Set 2013 23:40

Eu procurei revisar sim, mas não vi necessidade de nenhuma alteração. Talvez porque eu entenda muito pouco (quase nada) de PHP.

Por favor, veja se estou fazendo correto: tenho dois arquivos; o primeiro é o agcom.php, que está com o seguinte conteúdo:

<html>
  <body>
    <form action="filtrar.php" method="post">
      <label>Pesquisar Compromisso:</label>
      <input type="text" name="filtro" id="filtro" value="Digite aqui parte do texto procurado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui parte do texto procurado';}">
      <input type="submit" id="Pesquisar" value="Pesquisar">
   </form>
  </body>
</html>


Neste, como teste, estou digitando "FAZER" (sem as aspas e com maiúsculas), que é parte de alguns campos da base.

O outro arquivo é o filtrar.php, que está com o seguinte conteúdo:

<?
$txtFiltro  = $_GET["filtro"];
$txtCategoria = $_GET["categoria"];

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%' and vinculo LIKE '%".$txtCategoria."%'";
echo $sql;
echo $dns;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

echo "<table BORDER=1><tr>";
echo "<th>data</th>";
echo "<th>compr</th></tr>";
while (odbc_fetch_row($rs))
{
$compname=odbc_result($rs,"data");
$conname=odbc_result($rs,"compr");
echo "<tr><td>$compname</td>";
echo "<td>$conname</td></tr>";
}
odbc_close($conn);
echo "</tr></table>";
?>


Uma coisa que não entendi neste é a referência a txtcategoria, que aparentemente está filtrando o campo vínculo, sendo que este não precisaria ser filtrado. Testei tirar esta parte, deixando a linha assim:

 $sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%';


Mas daí está dando o seguinte erro:

PHP Parse error:  syntax error, unexpected T_STRING in C:\Inetpub\Wwwroot\inaciobr\filtrar.php on line 14


A linha 14, indicada no erro, está assim:

 {exit("Error in SQL");}


Em suma, ainda não estou conseguindo fazer o filtro funcionar.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor Toledo » 23 Set 2013 08:29

rochinha escreveu:Não tem como errar. Voce deve SEMPRE revisar os códigos.


rochinha escreveu:Para usar um formulário deverá ser trocado no código .PHP o $_GET por $_POST.


Prestar atenção e revisar os códigos é muito importante, de preferência linha por linha.

Veja as diferença entre a última instrução do nosso amigo Rochinha e o seu código na sua última mensagem:

Seu código:
$txtFiltro = $_GET["filtro"];
$txtCategoria = $_GET["categoria"];


Código do Rochinha:
$txtFiltro  = $_POST["filtro"];


Seu código:
$sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%' and vinculo LIKE '%".$txtCategoria."%'";

ou
$sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%';


Código do Rochinha:
$sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%'";


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Usando tabelas dBase com PHP

Mensagempor rochinha » 23 Set 2013 16:32

Amiguinhos,

Toledo - Obrigado pela força.

cjp - Nos ultimos exemplos que apresentei voce tinha 2(dois) códigos, um com somente um campo e outro com dois campos. Voce claramente deixou o código contendo um campo(que era o que atenderia) e manueou o que possuia dois campos produzindo o erro no código.

Imagine-se contratado a manusear um código crítico no qual o contratante é imperioso no quesito, NÃO PODE TESTAR, DEVE SER CONCERTADO.

Sem pleno conhecimento isto é impossível, mas se está se aprendendo o passo-a-passo ou linha-a-linha é imprescindível, mesmo porque toda linguagem de programação segue um traço lógico de conversa entre o programador e a maquina.

Os códigos que enviei NÃO precisam de alteração é jogar e rodar e a ÚNICA alteração que se PODE fazer é trocar no script .PHP o $_GET por $_POST pois eu testei os scripts diretamente passando os parâmetros via comando no browser usando $_GET.

Vamos lá denovo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4544
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 244 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 29 Set 2013 00:34

Agora deu certo.

Peço perdão pela desatenção e pela falta de conhecimentos básicos.

E agradeço muito a ajuda de todos.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 15 Out 2013 00:36

Colegas,

Estou tentando evoluir nesta questão, para estender a busca para outras bases de dados.

Uma primeira opção seria fazer um PHP para cada base, alterando a referência ao campo da base. Isto eu acho que conseguiria fazer.

Mas gostaria de saber se seria possível tornar o nome do campo da base como um curinga, para que a mesma busca pudesse ser feita em qualquer base de dados.

Pensei e tentei fazer algo mais ou menos assim:

O primeiro arquivo ficaria:

<html>
  <body>
    <form action="filtrar.php" method="post">
      <label>Pesquisar Compromisso:</label>
      <input type="text" name="filtro" id="filtro" value="Digite aqui parte do texto procurado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui parte do texto procurado';}">
      <label>No campo:</label>
      <input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome do campo a ser pesquisado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome do campo a ser procurado';}">
      <input type="submit" id="Pesquisar" value="Pesquisar">
   </form>
  </body>
</html>


Até aqui, aparentemente, tá tudo certo.

O segundo arquivo, eu fiz assim:

<?
$txtFiltro  = $_POST["filtro"];
$txtCampo  = $_POST["filtro2"];

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtCampo." WHERE compr LIKE '%".$txtFiltro."%'";
echo $sql;
echo $dns;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

echo "<table BORDER=1><tr>";
echo "<th>data</th>";
echo "<th>compr</th></tr>";
while (odbc_fetch_row($rs))
{
$compname=odbc_result($rs,"data");
$conname=odbc_result($rs,"compr");
echo "<tr><td>$compname</td>";
echo "<td>$conname</td></tr>";
}
odbc_close($conn);
echo "</tr></table>";
?>


Notem que eu só alterei a seguinte linha neste arquivo:

 $sql="SELECT * FROM ".$txtCampo." WHERE compr LIKE '%".$txtFiltro."%'";


E também incluí a seguinte linha:

$txtCampo  = $_POST["filtro2"];


Aqui está dando o seguinte erro:

PHP Warning:  odbc_exec() [<a href='function.odbc-exec'>function.odbc-exec</a>]: SQL error: [Microsoft][ODBC dBase Driver] The Microsoft Jet database engine could not find the object 'compr'.  Make sure the object exists and that you spell its name and the path name correctly., SQL state S0002 in SQLExecDirect in C:\Inetpub\Wwwroot\inaciobr\filtrar.php on line 12


O que eu estou fazendo errado? Ou não é possível fazer o que eu pensei?

Uma outra opção seria ele buscar o objeto pretendido em todos os campos da base, se isso for possível. Mas daí teria que ser se seria possível buscar em campos de tipos diferentes (numéricos, caracteres, data etc).
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor Toledo » 15 Out 2013 09:41

Inácio, tá meio confuso esta sua mensagem.

cjp escreveu:Mas gostaria de saber se seria possível tornar o nome do campo da base como um curinga, para que a mesma busca pudesse ser feita em qualquer base de dados.

Pelo final desta sua frase dá a entender que você quer criar um script de busca único, mas que possa ser feito em qualquer base de dados (arquivo DBF) que está no seu site.

cjp escreveu:<input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome do campo a ser pesquisado"

Agora, neste seu código você está falando de "nome do campo", que dá a entender que seja o nome de um campo da sua base de dados.

Bom, presumindo que a busca que você quer fazer seja em qualquer base de dados (arquivo DBF), você terá que se preocupar também com os nomes dos campos de cada base de dados, que provavelmente devem serem diferentes para cada arquivo.

Observe que neste seu código, você ainda está fazendo o filtro no campo "compr", então a dúvida e saber se este campo existe em todas as base de dados! Provavelmente é isto que está causando o erro no seu script, o campo "compr" não existe na base de dados que você está testando.

$sql="SELECT * FROM ".$txtCampo." WHERE compr LIKE '%".$txtFiltro."%'";


Uma outra coisa importante, seria evitar que o usuário digite o nome da base de dados ou o nome do campo para filtro, pois se for digitado um nome errado, vai gerar um erro no script.
Neste caso, seria melhor colocar um combobox no formulário para que o usuário escolha em qual base de dados será feito a busca.

Então, troque:
<input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome do campo a ser pesquisado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome do campo a ser procurado';}">


Por este código:
<select name="filtro2">
   <option value="nomedoDBF1">Descrição do DBF 1</option>
   <option value="nomedoDBF2">Descrição do DBF 2</option>
   <option value="nomedoDBF3">Descrição do DBF 3</option>
   <option value="nomedoDBF4">Descrição do DBF 4</option>
</select>


Onde está "nomedoDBF?" você vai colocar o nome da base de dados e na frente a sua descrição, por exemplo:
   <option value="agcom">Agenda de Compromissos</option>


Agora, resta saber se em todas as base de dados existe um campo com o nome "compr".

Bom, eu acho que não, então você teria que modificar o seu arquivo filtrar.php para verificar qual base de dados o usuário escolheu e configurar um campo de filtro.

No arquivo filtrar.php procure por:
$txtCampo  = $_POST["filtro2"];


E INCLUIR na linha seguinte o código:
$CampoFiltro = "";
if ($txtCampo == "agcom") {
  $CampoFiltro = "compr";
}

Repita o código acima para as outras bases de dados que foram relacionadas no combobox, mudando o nome da base de dados e o nome do campo para filtro.

Procure por:
$sql="SELECT * FROM ".$txtCampo." WHERE compr LIKE '%".$txtFiltro."%'";


Troque por:
$sql="SELECT * FROM ".$txtCampo." WHERE ".$CampoFiltro." LIKE '%".$txtFiltro."%'";


Se não esqueci de nada, acho que isto funciona.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Usando tabelas dBase com PHP

Mensagempor rochinha » 15 Out 2013 13:36

Amiguinho,

O que eu estou fazendo errado?


O comando SELECT é o mais importante e necessita de conhecimento de seus parâmetros que com certeza voce irá adquirir com erros e acertos.

SELECT * FROM NomeDaTabela WHERE MinhaCritica

Onde:

SELECT * - Voce estará dizendo que quer todos os campos e seus conteúdos celecionados para o processo.
FROM NomeDaTabela - Voce vai especificar de qual tabela irá puxar o conteúdo.
WHERE MinhaCritica - Voce irá critica e customizar.

Ou não é possível fazer o que eu pensei?


Verifique novamente seu código e confira.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4544
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 244 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 15 Out 2013 16:44

De fato eu havia me confundido. Agora deu certo. Muito obrigado.

Mas ficou mais uma dúvida: como são várias bases, cada uma com campos diferentes, teria como abrir um combobox para escolher dentre as bases existentes na pasta do FTP (sem eu precisar digitar o nome de todas as bases), até porque de vez em quando serão acrescidas novas bases?

E depois, escolhida a base, seria possível abrir o combobox com os nomes dos campos da base escolhida para o usuário escolher entre os campos da base escolhida?

Outra dúvida: como faço para direcionar para uma subpasta do FTP onde ficam as bases? Existe algum comando do tipo "cd nome_pasta"?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 19 Out 2013 11:04

Caro Rochinha,

Vc saberia me informar se existe alguma função que retorne os campos da base de dados aberta?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor rochinha » 22 Out 2013 07:26

Amiguinho,

Montei este trecho de codigo mas não testei:
<?
        $dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
        $conn= odbc_connect($dsn,"","");
        if(!$conn)
                { exit("conexao falhou: ".odbc_errormsg()); }
       
                $sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%'";
                $rs=odbc_exec($conn,$sql);
       
                if (!$rs)
                        {exit("Error in SQL");}
         
                        $i = 0;
                        $fieldCount = odbc_num_fields($result);
                        echo "  <table$css_table>\n";
                        echo "   <tr$css_tr>\n";

                        while ($i < $fieldCount)
                        {
                                $i++;
                                $fieldName = odbc_field_name($result, $i);
                                echo "    <th$css_th>$fieldName</th>\n";
                        }
                        echo "   </tr>\n";
                odbc_close($conn);
?>


Mais informações em www.php.net

Classes em PHP para manipular diretamente arquivos dBase sem frescuras:

www.phpclasses.org
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4544
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 244 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 22 Out 2013 22:10

Está dando o seguinte erro:

PHP Warning:  odbc_num_fields(): supplied argument is not a valid ODBC result resource in C:\Inetpub\Wwwroot\inaciobr\filtrar.php on line 14


A linha 14, onde está apontado o erro, é a seguinte:

            $fieldCount = odbc_num_fields($result); 


Eu não alterei nada no teu modelo, pois acho que não tem nada que precisa ser adaptado. Só salvei todo como filtrar.php e coloquei no FTP.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor rochinha » 23 Out 2013 00:42

Amiguinho,

Este foi um erro proposital, para testar a sua atenção, para que coloque a variável correta na linha com erro.

Sem prova e acerto nunca se chega a perfeição. Try Again!
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4544
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 244 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 23 Out 2013 14:46

Puxa, meu amigo, eu sou leigo demais no assunto, para matar essas "pegadinhas".

Tentei substituir o $result pelo nome da base, de várias formas, mas sempre dá erro.

Na minha cabeça de programador leigo em clipper/harbour, essa linha significaria:

$fieldCount - uma variável que acolheria o número de campos da base

odbc_num_fields - a função que retorna o número de campos da base

$result - a base de dados de onde se quer tomar o número de campos

Se eu estiver correto, eu teria que trocar o $result pelo nome da base. Mas isso não funcionou.

Então, eu não devo estar correto. E neste caso, não sei o que fazer. Me ajude, por favor.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Usando tabelas dBase com PHP

Mensagempor rochinha » 23 Out 2013 17:36

Amiguinho,

Tava fácil:
$rs=odbc_exec($conn,$sql);


Onde $rs é a variável que armazena o conteúdo do comando odbc_exec().

Já na linha:
$fieldCount = odbc_num_fields($result);


odbc_num_fields() precisa acessar o conteúdo desta variável para manipula-la então de onde vem $result?

Veja a diferença de um vinho rosé e um vinho tinto. O tinto precisa de mais tempo de maturação para incorporar a coloração.

Assim como no programação, o tratamento de variáveis e uso das estruturas leva tempo, mesmo porque após conhecê-las voce começará a criticá-las.

A "critica" em programação é o método no qual definimos se a estrutura atende nossas indagações, se segue ou se para.

As linguagens assumem formas de escrita diferentes, mas todas manipulam variáveis, laços, criticas, objetos e procedimentos.

Perceba também que para o aprendizado ser valoroso voce passará a codificar pequeninos trechos de código até chegar a trechos maiores.

Linguagens de script são na maioria das vezes codificações superficiais ou reduzidas de um motor mais complexo, ou seja, os scripts são uma tunagem.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4544
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 244 vezes

Usando tabelas dBase com PHP

Mensagempor cjp » 26 Out 2013 00:08

De fato, é fácil, para quem entende. Para mim, que tenho pouquíssimos conhecimentos... jamais conseguiria descobrir sem tua ajuda.

Agora sim, funcionou. Vi que também tinha o mesmo "erro" na linha 21 e já corrigiu e deu certo.

Muito obrigado por tua ajuda e por tuas valiosas lições.

Sou bem leigo, mas sei que, com muito esforço e com a ajuda de vocês, certamente vou conseguir aprender. Obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Anterior Próximo



Retornar para Outras linguagens de programação

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro