Usando tabelas dBase com PHP

Fórum sobre outras linguagens de programação.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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:

Código: Selecionar todos

<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:

Código: Selecionar todos

<?
$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:

Código: Selecionar todos

 $sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%';
Mas daí está dando o seguinte erro:

Código: Selecionar todos

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:

Código: Selecionar todos

 {exit("Error in SQL");}
Em suma, ainda não estou conseguindo fazer o filtro funcionar.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Usando tabelas dBase com PHP

Mensagem por Toledo »

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:

Código: Selecionar todos

$txtFiltro = $_GET["filtro"];
$txtCategoria = $_GET["categoria"];
Código do Rochinha:

Código: Selecionar todos

$txtFiltro  = $_POST["filtro"];
Seu código:

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

$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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Usando tabelas dBase com PHP

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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:

Código: Selecionar todos

<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:

Código: Selecionar todos

<?
$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:

Código: Selecionar todos

 $sql="SELECT * FROM ".$txtCampo." WHERE compr LIKE '%".$txtFiltro."%'";
E também incluí a seguinte linha:

Código: Selecionar todos

$txtCampo  = $_POST["filtro2"];
Aqui está dando o seguinte erro:

Código: Selecionar todos

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
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Usando tabelas dBase com PHP

Mensagem por Toledo »

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.

Código: Selecionar todos

$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:

Código: Selecionar todos

<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:

Código: Selecionar todos

<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:

Código: Selecionar todos

   <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:

Código: Selecionar todos

$txtCampo  = $_POST["filtro2"];
E INCLUIR na linha seguinte o código:

Código: Selecionar todos

$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:

Código: Selecionar todos

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

Código: Selecionar todos

$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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Usando tabelas dBase com PHP

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

Caro Rochinha,

Vc saberia me informar se existe alguma função que retorne os campos da base de dados aberta?
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Usando tabelas dBase com PHP

Mensagem por rochinha »

Amiguinho,

Montei este trecho de codigo mas não testei:

Código: Selecionar todos

<?
        $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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

Está dando o seguinte erro:

Código: Selecionar todos

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:

Código: Selecionar todos

            $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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Usando tabelas dBase com PHP

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Usando tabelas dBase com PHP

Mensagem por rochinha »

Amiguinho,

Tava fácil:

Código: Selecionar todos

$rs=odbc_exec($conn,$sql);
Onde $rs é a variável que armazena o conteúdo do comando odbc_exec().

Já na linha:

Código: Selecionar todos

$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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando tabelas dBase com PHP

Mensagem por cjp »

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
Responder