Clipper On Line • Ver Tópico - Usando tabelas dBase com PHP
Página 1 de 7

Usando tabelas dBase com PHP

MensagemEnviado: 26 Mar 2012 23:15
por rochinha
Amiguinhos,

Eu posso até parecer meio chato e insistente, mas quando alguma coisa me intriga gosto de verificar na prática para ver o resultado.

Pelo título muitos já pensaram, "Hi, lá vem alguém falando do uso de SQL..."

Não. Na verdade só vou exemplificar com conteúdo os testes que fiz para ter certeza se posso ou não usar o PHP para fazer algumas coisas básicas com tabelas dBase.

Mais uma vez alguém dirá, "Hi, outro cara que insiste em usar dBase..."

Sou mesmo, insistente.

Em primeiro lugar quero dizer que fiz os testes usando o servidor MiniServX, tão bom quando ao Apache e executa com perfeição o PHP.

O PHP tinha em sua configuração ativo o módulo de controle de tabelas dBase, php_dbase.dll.

Bom vamos aos código, que falam por si só.

***************************************************************************************************************************************************
1-Criando um banco de dados

int dbase_create (string filename, array fields)

A função dbase_create() cria um bando de dados do dbase a partir
de um vetor que possui a estrutura do banco, e seu nome é especificado
por filename. A função retorna um identificador de arquivo dbase, ou seja,
um dbase_identifier em caso de sucesso, ou FALSE caso falhar.

Exemplo:
<?php
dbase_create('clientes.dbf', $estruct);
? >


Será criado um banco de dados chamado clientes.dbf baseado na estrutura definida por $estruct.

Antes de usar a função dbase_create você deve definir a estrutura do banco.Essa estrutura é um vetor contendo sub-vetores, onde cada sub-vetor contém a definição dos atributos de um campo do banco de dados.

Exemplo:
<?php
$estruct = array("idade", "N", 3, 0);
?>


A primeira posição do vetor especifica o nome do campo, a segunda especifica o tipo de dados do campo, a terceira especifica o tamanho do campo, e por fim a quarta posição especifica o número de casas decimais.

Os tipos de campos disponíveis são:
L - Boolean
M - Memorando
D - Data
N - Número
C - Caracteres ( string )

Segue abaixo um exemplo de sua utilização:
<?php

// definindo a estrura
$estruct = array(
    array("data", "D"),
    array("nome", "C", 50),
    array("idade", "N", 3, 0),
    array("email", "C", 128),
    array("texto", "M", 255),
    array("membro", "L")
);

// criando o banco de dados
if (!dbase_create('clientes.dbf', $estruct)) {
    print "O banco de dados não pode ser criado.";
}

?>


***************************************************************************************************************************************************
2-Abrindo o banco de dados

int dbase_open (string filename, int flags)

A função dbase_open() abre um banco de dados do dbase cujo nome é apontado por filename.
Os tipos de operações permitidas são definidas pelo valor do argumento flags. Os valores legais para flags são:

0 - somente leitura
1 - somente escrita
2 - leitura e escrita

A função retorna um identificador de arquivo dbase, ou seja, um dbase_identifier em caso de sucesso, ou FALSE caso falhar.

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open("clientes.dbf", 2);
if (!$db) {
    print "o banco de dados especificado não pode ser aberto";
}

?>


***************************************************************************************************************************************************
3-Fechando o banco de dados

bool dbase_close (int dbase_identifier)

A função dbase_close() fecha o banco de dados do dbase associado ao dbase_identifier.

Segue abaixo um exemplo de sua utilização:
<?php    

$db = dbase_open("clientes.dbf", 2);
if (!$db) {
    print "o banco de dados especificado não pode ser aberto";
} else {
     // caso clientes.dbf esteja aberto ele fecha o mesmo
    dbase_close($db);
}

?>


***************************************************************************************************************************************************
4-Adicionando registros ao banco de dados

bool dbase_add_record (int dbase_identifier, array record)

A função dbase_add_record() adiciona um registro ao banco de dados dbase. Retorna TRUE em caso de sucesso e FALSE caso contrário.

Segue abaixo um exemplo comentado de sua utilização:
<?php
// iremos adicionar um registro ao banco de dados clientes.dbf criado anteriormente.
$db = dbase_open('clientes.dbf', 2);

// reparem que a data está no formato YYYYMMDD e para o campo lógico foi passado
// um caracter, os caracteres válidos para este campo são T (true) e F (false).
$registro = array("20030822", "Fulano de Tal", 20, "fulanodetal@email.com.br", "somente um teste", 'T');
if (!dbase_add_record($db, $registro)) {
    print 'Não foi possível inserir registro no banco de dados';
}
dbase_close($db);

?>


***************************************************************************************************************************************************
5-Deletando registros do banco de dados

bool dbase_delete_record (int dbase_identifier, int record)

A função dbase_delete_record() marca o registro a ser deletado enquanto

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open('clientes.dbf', '2');
// marca o primeiro registro
dbase_delete_record($db, 1);
dbase_close($db);

?>


***************************************************************************************************************************************************
6-Limpando registros do banco de dados

bool dbase_pack (int dbase_identifier)

a função dbase_pack() exclui permanentemente os registros marcados.

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open('clientes.dbf', '2');
// deleta todos os registros marcados
dbase_pack($db);
dbase_close($db);

?>


***************************************************************************************************************************************************
7-Obtendo informações do banco de dados

int dbase_numfields (int dbase_identifier)

A função dbase_numfields() retorna o número de campos. O argumento dbase_identifier deve ser um identificador de arquivo dbase válido retornado por uma chamada a dbase_open() ou dbase_create().

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open("clientes.dbf", 2);
printf("clientes.dbf contém %d campos\n", dbase_numfields($db));
dbase_close($db);

?>


***************************************************************************************************************************************************
8-Obtendo informações do banco de dados

int dbase_numrecords (int dbase_identifier)

A função dbase_numrecords() retorna o número de registros. O argumento dbase_identifier deve ser um identificador de arquivo dbase válido retornado por uma chamada a dbase_open() ou dbase_create().

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open("clientes.dbf", 2);
printf("clientes.dbf contém %d registros\n", dbase_numrecords($db));
dbase_close($db);

?>


***************************************************************************************************************************************************
9-Substituindo um registro no banco de dados

bool dbase_replace_record (int dbase_identifier, array record, int dbase_record_number)

A função dbase_replace_record() substitui um registro no banco de dados, e geralmente é usada para alterar dados em um registro. O argumento record_number é o número do registro a ser alterado e o argumento record deve ser um vetor com os dados do registro.

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open('clientes.dbf', '2');

// no registro abaixo alterei apenas o campo nome e e-mail do registro
// adiconado anteriormente, mas você pode alterar todos se quiser
$registro = array("20030822", "Ciclano", 20, "ciclano@email.com.br", "Troquei o conteudo", 'T');

if (!dbase_replace_record($db, $registro, 2)) {
    print 'Não foi possível alterar registro no banco de dados';
}
dbase_close($db);

?>


***************************************************************************************************************************************************
10-Lendo um registro do banco de dados (parte 1)

array dbase_get_record (int dbase_identifier, int record)

A função dbase_get_record() lê um registro do banco de dados e o retorna em um vetor.

Cada campo é convertido ao tipo de dados apropriado do PHP, exceto:
- Datas que permanecem como strings
- Inteiros que teriam causado um transbordamento (> 32 bits) que seriam devolvidos como string.

Além dos indices numéricos o vetor que contém os dados do registro contém um índice associativo de nome 'deleted' que indica se o registro está marcado ou não, o valor 1 indica que este campo está marcado e 0 caso contrário.

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open("clientes.dbf", 2);
$registro = dbase_get_record($db, 1);

print "data  : $registro[0]<br>";
print "nome  : $registro[1]<br>";
print "idade : $registro[2]<br>";
print "email : $registro[3]<br>";
print "texto : $registro[texto]<br>";
print "membro: $registro[4]<br>";

// agora verificamos se o registro está marcado
if ($registro['deleted']) {
    print '__DELETADO__';
}
dbase_close($db);

?>


***************************************************************************************************************************************************
11-Lendo um registro do banco de dados (parte 2)

array dbase_get_record_with_names (int dbase_identifier, int record)

A função dbase_get_record_with_names() lê um registro do banco de dados e o retorna em um vetor associativo. Essa função é idêntica a dbase_get_record() exceto que o vetor retornado por dbase_get_record_with_names() é associativo, sendo que cada índice do vetor corresponde ao nome de um campo no banco de dados.

Segue abaixo um exemplo de sua utilização:
<?php

$db = dbase_open("clientes.dbf", 2);
$registro = dbase_get_record_with_names($db, 1);

print "data  : $registro[data]<br>";
print "nome  : $registro[nome]<br>";
print "idade : $registro[idade]<br>";
print "email : $registro[email]<br>";
print "texto : $registro[texto]<br>";
print "membro: $registro[membro]<br>";

// agora verificamos se o registro está marcado
if ($registro['deleted']) {
    print '__DELETADO__';
}
dbase_close($db);

?>


Com base nos exemplos acima podemos executar os comandos em bases compartilhadas.

Fiz os testes usando um browse enquanto que a tabela esta aberta em modo compartilhado.

A deleção de registros ocorreu sem travamento de registros, visto que a biblioteca não possui tais comandos.

O campo MEMO apesar de ter sido criado e ter o .DBT associado não permitiu o manuseio salvando o conteúdo num campo texto normal mas de tamanho que não ultrapassou 10 caracteres.

Para um uso aprimorado o melhor seria abertura via Connection String e ODBC somado a comandos SQL.

Bom estão ai os meus testes para conclusões e criticas.

Usando tabelas dBase com PHP

MensagemEnviado: 01 Ago 2013 23:40
por cjp
Estou testando estas funções, mas está dando o seguinte erro:

Fatal error: Call to undefined function dbase_open() in /dados/www/dominios/htdocs/promotor/www.inaciocarvalho.com.br/teste.php on line 3


O que é isso?

Usando tabelas dBase com PHP

MensagemEnviado: 02 Ago 2013 04:23
por rochinha
Amiguinho,

O módulo dBase do .PHP deve estar ativo no seu servidor para que as funções tenham efeito.

O seu servidor deverá dar suporte a arquivos dBase pelo .PHP através do uso da extensão php_dbase.dll no caso de rodar .PHP pelo Windows ou php_dbase.so no caso de rodar .PHP pelo Linux.

No arquivo PHP.INI a linha a que se refere a extensão deverá ser habilitada retirando o caracter ";":
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example, on Windows:
;
;   extension=msql.dll
;
; ... or under UNIX:
;
;   extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here.  Specify the location of the extension with the
; extension_dir directive above.

extension=php_dbase.dll

Usando tabelas dBase com PHP

MensagemEnviado: 02 Ago 2013 16:30
por cjp
Se eu entendi direito, eu tenho que salvar o arquivo que vc postou como php.ini no ftp do meu site, escolhendo o extension=msql.dll (já que uso o Windows, não o unix), correto?

Fiz isso, mas continua não dando certo, o erro que aparece é o mesmo.

Será que eu entendi errado?

Usando tabelas dBase com PHP

MensagemEnviado: 02 Ago 2013 21:05
por rochinha
Amiguinho,

Se voce tiver completo controle sobre seu host, ou seja, voce instalou e configurou os servidores de scripts, inclusive o .PHP deverá modificar o .PHP.INI na pasta do PHP. Não basta apenas subir a alteração como postei.

Se o seu host é um UOL, Terra, LocaWeb, etc deverá contactar os suporte e pedir que façam a alteração para dar este tipo de suporte.

Usando tabelas dBase com PHP

MensagemEnviado: 06 Ago 2013 00:03
por cjp
Estou tentando com o meu provedor que façam esta alteração. Eles me questionaram quais são as alterações necessárias para isso. Eles não deviam saber isso?

Usando tabelas dBase com PHP

MensagemEnviado: 06 Ago 2013 01:16
por rochinha
Amiguinho,

Eles não deviam saber isso?


Infelizmente nem sempre. É necessário um conhecimento profundo e geralmente o pessoal técnico esta focado no básico das ferramentas de maior uso. Este caso é um detalhe.

Bastará que eles alterem a linha(se for um servidor Windows):
; extension=php_dbase.dll


Para
extension=php_dbase.dll


Bastará que eles alterem a linha(se for um servidor Linux):
; extension=php_dbase.so


Para
extension=php_dbase.so


Em todo caso verifique também se o seu host lhe habilita suporte para scripts .ASP. Neste caso use o tópico Usando tabelas dBase com ASP.

Infelizmente o tópico é muito recente e não aparece no topo das buscas no google, diferentemente se digitar: Usando tabelas dBase com PHP

Mais informação a respeito

Tenha em mente que o uso de tabelas deste tipo com ASP ou PHP tem limitações, como possiveis problemas com campos memo ou mau uso de banda. Portanto use a técnica para manipulação pequena de dados.

Usando tabelas dBase com PHP

MensagemEnviado: 15 Ago 2013 21:47
por cjp
Amigo,

Depois de uma grande disputa com o provedor, que resultou inclusive na troca de provedor e em quase uma semana com meu site e e-mail PRO fora do ar, finalmente consegui habilitar o PHP.

Mas ainda está dando o seguinte erro na minha função:

PHP Warning:  dbase_open() [<a href='function.dbase-open'>function.dbase-open</a>]: unable to open database agenda.dbf in C:\Inetpub\Wwwroot\inaciobr\teste.php on line 3
PHP Warning:  dbase_get_record() [<a href='function.dbase-get-record'>function.dbase-get-record</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\teste.php on line 4
PHP Warning:  dbase_close() [<a href='function.dbase-close'>function.dbase-close</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\teste.php on line 19


Não sei se ainda falta o provedor habilitar alguma coisa, ou se tem algum erro na minha função, que está assim:

<?php

$db = dbase_open("agenda.dbf", 2);
$registro = dbase_get_record($db, 1);

print "data : $registro[0]
";
print "valor : $registro[1]
";
print "campo : $registro[2]
";
print "historico : $registro[3]
";

// agora verificamos se o registro está marcado
if ($registro['deleted']) {
  print '__DELETADO__';
}
dbase_close($db);

?>

Usando tabelas dBase com PHP

MensagemEnviado: 15 Ago 2013 22:41
por rochinha
Amiguinho,

Também estive as voltas com configurações do .PHP, dBase e Apache.

Ainda não cheguei onde queria, mas nos testes que fiz usando um servidor PHP para o desktop, o MiniServX, consegui fazê-lo subir com suporte ao dBase.

Eu havia configurado o ServCGI(projeto que disponibilizei) tenho pra mim que configurei o Apache existente nele com tal recurso. Pena que o arquivo foi deletado de meu servidor e não tenho um backup para subir novamente.

Mas assim que obtiver exito, dou-lhe um auxilio.

Usando tabelas dBase com PHP

MensagemEnviado: 16 Ago 2013 01:12
por rochinha
Amiguinho,

Supondo que sua tabela agenda.dbf, esteja na pasta c:\web\dados e que contenha um campo chamado telefone, atente:
<?php

      $dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=c:\web\dados;";
      $conn= odbc_connect($dsn,"","");

      if(!$conn)
      {
            exit("conexao falhou: ".odbc_errormsg());
      }

      $sql = "select * from agenda";
      $rs = odbc_exec($conn, $sql);

      echo "<table><tr>";
      echo "<th>Telefone</th></tr>";

      while (odbc_fetch_row($rs))
      {
            echo "<tr><td>".odbc_result($rs, "telefone")."</td></tr>";
      }
      odbc_close($conn);
      echo "</table>"

?>

Usando tabelas dBase com PHP

MensagemEnviado: 16 Ago 2013 23:54
por cjp
Amigo, agora está dando o seguinte erro:

PHP Warning:  odbc_connect() [<a href='function.odbc-connect'>function.odbc-connect</a>]: SQL error: [Microsoft][ODBC dBase Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x1a18 Thread 0x427c DBC 0x235339c Xbase'., SQL state S1000 in SQLConnect in C:\Inetpub\Wwwroot\inaciobr\teste.php on line 4


Fiquei com dúvida se a base deveria consta na pasta c:\web\dados, como vc citou, ou se deveria ficar no ftp, como os demais arquivos do site.

Mas testei das duas formas, e o erro foi o mesmo.

Usando tabelas dBase com PHP

MensagemEnviado: 17 Ago 2013 00:28
por rochinha
Amiguinho,

No exemplos dados pastas e diretórios são pessoais e fictícios, variam de máquina ou gosto. Voce deve configurar a sua para no lugar da que foi passada no exemplo.

Poste o código, somente a mensagem de erro não ajuda.

Usando tabelas dBase com PHP

MensagemEnviado: 17 Ago 2013 00:46
por cjp
É que eu usei exatamente o teu modelo, para testar, sem mudar absolutamente nada. De qualquer forma, aí vai ele:

<?php

   $dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=c:\web\dados;";
   $conn= odbc_connect($dsn,"","");

   if(!$conn)
   {
      exit("conexao falhou: ".odbc_errormsg());
   }

   $sql = "select * from agenda";
   $rs = odbc_exec($conn, $sql);

   echo "<table><tr>";
   echo "<th>Telefone</th></tr>";

   while (odbc_fetch_row($rs))
   {
      echo "<tr><td>".odbc_result($rs, "telefone")."</td></tr>";
   }
   odbc_close($conn);
   echo "</table>"

?>


A base agenda tem o campo telefone sim.

E coloquei-a tanto no FTP do site, como na pasta c:\web\dados, como vc mencionou antes.

Usando tabelas dBase com PHP

MensagemEnviado: 23 Ago 2013 00:25
por cjp
Rochinha, por favor, me ajude a resolver este problema.

Usando tabelas dBase com PHP

MensagemEnviado: 23 Ago 2013 03:27
por rochinha
Amiguinho,

Voce está fazendo os testes e executando os scripts em um site na internet?

Se estiver na internet no lugar de:
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=c:\web\dados;";


Coloque:
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";


ou:
$dsn = "DRIVER={Driver da Microsoft para o dBase (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";


A tabela deverá estar na mesma pasta do script.

Usando tabelas dBase com PHP

MensagemEnviado: 24 Ago 2013 22:45
por cjp
Funcionou, meu caro. Muito obrigado.

Entretanto, ainda está dando o seguinte aviso (parece que não é erro):

PHP Warning:  odbc_connect() [<a href='function.odbc-connect'>function.odbc-connect</a>]: SQL error: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified, SQL


Também gostaria de saber se existe alguma possibilidade de pesquisar dentro dos campos da base.

Usando tabelas dBase com PHP

MensagemEnviado: 25 Ago 2013 13:09
por rochinha
Amiguinho,

Analisando o trecho abaixo:
$dsn = "DRIVER={Driver da Microsoft para o dBase (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
$conn= odbc_connect($dsn,"","");


Modifique para:
$dsn = "DRIVER={Driver da Microsoft para o dBase (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
echo $dsn;
$conn= odbc_connect($dsn,"","");
echo $dsn;


echo irá mostrar o resultado, identico ao @..SAY de forma que voce veja o que realmente está passando ao PHP.

Usando tabelas dBase com PHP

MensagemEnviado: 25 Ago 2013 18:55
por filizola
alguém aí teria uma consulta ao estoque de produtos ?

Usando tabelas dBase com PHP

MensagemEnviado: 25 Ago 2013 23:57
por cjp
Ok, apareceu.

E quanto à outra questão: existe uma forma de filtrar campos da base para a exibição? Ou fazer uma busca nos campos?

Usando tabelas dBase com PHP

MensagemEnviado: 26 Ago 2013 09:44
por rochinha
Amiguinhos,

Segue um exemplo de listagem em uma base de dados onde acontece uma fultragem(SELECT) dos dados e apresentação de conteúdo de campos selecionados:
<html>
<body>

<?php
$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 clientes WHERE estado = 'SP'";
   $rs=odbc_exec($conn,$sql);
   if (!$rs)
      {exit("Error in SQL");}
      echo "<table><tr>";
      echo "<th>Nome</th>";
      echo "<th>Telefone</th></tr>";
      while (odbc_fetch_row($rs))
        {
        $compname=odbc_result($rs,"Nome");
        $conname=odbc_result($rs,"Telefone");
        echo "<tr><td>$compname</td>";
        echo "<td>$conname</td></tr>";
        }
      odbc_close($conn);
      echo "</table>";
?>

</body>
</html>

Usando tabelas dBase com PHP

MensagemEnviado: 27 Ago 2013 01:19
por cjp
Funcionou, meu caro. Muito obrigado.

Mas ainda me faltam duas coisas para isso ficar perfeito:

1) preciso deixar o usuário do site escolher o filtro; ou seja, preciso abrir um campo para ele digitar o filtro a ser usado;

2) ao invés de WHERE estado = 'SP', eu precisava de algo como WHERE 'SP' $ estado, para ele localizar uma parte do campo; tentei assim, mas não funcionou.

Por favor, dá uma mais ajudazinha pra terminar isso. Obrigado.

Usando tabelas dBase com PHP

MensagemEnviado: 27 Ago 2013 19:04
por rochinha
Amiguinho,

Não tem muito segredo, bastará voce pensar nos formulários, ou seja, assim como se cria uma tela com get voce deverá criar um form com inputs e direcionar para um script que faça a verificação e traga o resultado:
<!DOCTYPE html> 
<html>
<body>
 
        <form action="filtrar.php" method="post">

            <label>Pesquisar Estado:</label>
            <input type="text" name="txtEstado" id="txtEstado" value="Digite a UF aqui" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite a UF aqui';}">
            <input type="submit" id="Pesquisar" value="Pesquisar">

        </form>

</body>
</html>


<?
$txtEstado = $_POST["txtEstado"];

$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 clientes WHERE estado = '$txtEstado'";
   $rs=odbc_exec($conn,$sql);
   if (!$rs)
      {exit("Error in SQL");}
      echo "<table><tr>";
      echo "<th>Nome</th>";
      echo "<th>Telefone</th></tr>";
      while (odbc_fetch_row($rs))
        {
        $compname=odbc_result($rs,"Nome");
        $conname=odbc_result($rs,"Telefone");
        echo "<tr><td>$compname</td>";
        echo "<td>$conname</td></tr>";
        }
      odbc_close($conn);
      echo "</table>";
?>

Usando tabelas dBase com PHP

MensagemEnviado: 28 Ago 2013 01:20
por cjp
Entendi, meu caro.

Mas eu devo estar fazendo algo errado ao adaptar pro que preciso, pois está sumindo a tela depois de clicar em Pesquisar.

Minha função ficou assim:

<!DOCTYPE html> 
<html>
<body>

    <form action="filtrar.php" method="post">

      <label>Pesquisar Compromisso:</label>
      <input type="text" name="Compr" id="Compr" 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>

<?
$txtEstado = $_POST["Compr"];

$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 = '$txtEstado'";
$rs=odbc_exec($conn,$sql);
if (!$rs)
   {exit("Error in SQL");}

      echo "<table><tr>";
   echo "<th>Data     Compromisso    Campo    Hora    Vínculo</th></tr>";

   while (odbc_fetch_row($rs))
   {
      echo "<tr><td>".odbc_result($rs, "data")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "compr")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "campo")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "hora")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "vinculo")."</td></tr>";
   }
   odbc_close($conn);

   echo "</table>";
?>


Um primeiro problema é que, antes mesmo de fazer a pesquisa, já está aparecendo todos os campos da base.

Mas o pior é que, depois de clicar em Pesquisar, o site simplesmente fecha, abrindo a página inicial do browser, sem nenhuma informação.

O que eu fiz errado?

Usando tabelas dBase com PHP

MensagemEnviado: 29 Ago 2013 13:18
por rochinha
Amiguinho,

Esqueci de dizer que o trecho que estiver entre de "<?" e "?>" é o conteúdo de filtrar.php que deve ser salvo em separado.

Sendo o conteúdo de filtrar.php:
<?php

$dns=...
...

?>


Veja que acrescentei a sigla php que para mim funcionou sem e com ela.

Usando tabelas dBase com PHP

MensagemEnviado: 30 Ago 2013 00:57
por cjp
Resolveu a parte de estar aparecendo junto e também a parte do erro de fechar o site.

Mas ainda não está filtrando a base; estão aparecendo todos os campos da base, independentemente do que eu digite na pesquisa.

O que eu ainda estou fazendo errado?

Minha função está assim:

<!DOCTYPE html> 
<html>
<body>

    <form action="filtrar.php" method="post">

      <label>Pesquisar Compromisso:</label>
      <input type="text" name="Compr" id="Compr" 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>



E o filtrar.php está assim:

<?
$txtEstado = $_POST["Compr"];

$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 = '$txtEstado'";
$rs=odbc_exec($conn,$sql);
if (!$rs)
   {exit("Error in SQL");}

      echo "<table><tr>";
   echo "<th>Data     Compromisso    Campo    Hora    Vínculo</th></tr>";

   while (odbc_fetch_row($rs))
   {
      echo "<tr><td>".odbc_result($rs, "data")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "compr")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "campo")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "hora")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "vinculo")."</td></tr>";
   }
   odbc_close($conn);

   echo "</table>";
?>


Usando tabelas dBase com PHP

MensagemEnviado: 30 Ago 2013 21:07
por filizola
name="txtEstado" id="txtEstado" e nao name="compr" id="compr"

Usando tabelas dBase com PHP

MensagemEnviado: 30 Ago 2013 21:37
por cjp
Continua na mesma, meu amigo. Ainda não resolveu.

De fato eu havia alterado o exemplo, pois achei que era pra colocar o nome do campo da base, mas agora coloquei de volta como estava, e não resolveu.

Usando tabelas dBase com PHP

MensagemEnviado: 31 Ago 2013 10:13
por Toledo
Amigo, tenta o seguinte:

$sql="SELECT * FROM agcom WHERE compr = '".$txtEstado."'";


Abraços,

Usando tabelas dBase com PHP

MensagemEnviado: 02 Set 2013 00:32
por cjp
Ainda não resolveu. Continua aparecendo todos os campos da base após teclar em Pesquisar.

Usando tabelas dBase com PHP

MensagemEnviado: 02 Set 2013 02:18
por rochinha
Amiguinho,

Quando se trata de SQL, sentenças como: SP, Sp, sP ou sp são totalmente diferentes.

Se voce tenta pesquisar em uma base conteúdo em minusculas usando critica em maiúsculas não obterá exito.

Tem sim algum erro na sentença SQL para isto na linha abaixo do [b]$sql="SELECT * FROM agcom .../b] coloque uma linha:
echo $dns;


Para visualizar o resultado do comando. Se voce está filtrando o erro acontece se nada é mostrado. Se esta aparecendo tudo é porque satisfaz o filtro.

Outra coisa que voce deve diferenciar são as nomenclaturas, campos, registros e conteúdos são coisas diferentes.

Campos são as células que possuem o conteúdo.
registros são o conjunto de campos.

Então o que voce está vendo é: Todos os registros com conteúdos dos campos data,compr,campo,hora,vinculo.

Use algum aplicativo de visualizção de .DBF como DBFViewer2000, WinDBU, DBU, ou outro e veja o conteúdo do campo do filtro se está em maiúsculas ou minúsculas e forme seu filtr a partir do que ver.

Usando tabelas dBase com PHP

MensagemEnviado: 03 Set 2013 00:51
por cjp
Amigo,

Na base está tudo em maiúscula.

Já testei digitando em maiúsculas ou em minúsculas. De qualquer forma, aparece todos os registros.

Usando tabelas dBase com PHP

MensagemEnviado: 03 Set 2013 02:30
por rochinha
Amiguinho,

Em primeiro lugar de uma revisada no seu código, ele não se parece em nada com o segundo exemplo que lhe passei. O primeiro exemplo do qual voce recortou e colou poderia funcionar para somente um coluna mas para o caso de mais campos e mais colunas o HTML precisa ser formatado.
O meu código:
   echo "<table><tr>";
   echo "<th>Nome</th>";
   echo "<th>Telefone</th></tr>";
   while (odbc_fetch_row($rs))
      {
      $compname=odbc_result($rs,"Nome");
      $conname=odbc_result($rs,"Telefone");
      echo "<tr><td>$compname</td>";
      echo "<td>$conname</td></tr>";
      }
   odbc_close($conn);
   echo "</table>";


O teu código:
   echo "<table><tr>";
   echo "<th>Data     Compromisso    Campo    Hora    Vínculo</th></tr>";
   while (odbc_fetch_row($rs))
      {
      echo "<tr><td>".odbc_result($rs, "data")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "compr")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "campo")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "hora")."</td></tr>";
      echo "<tr><td>".odbc_result($rs, "vinculo")."</td></tr>";
      }
        odbc_close($conn);
        echo "</table>";


Entenda, que programar em HTML não é o mesmo que DOS, não existe a figura da Linha e Coluna, tudo depende muito do estilo de letra que se usa e os espaçamentos entre cada tipo muda muito.

Veja que no meu exemplo eu pego o resultado e coloco em variáveis e depois às insiro nas sentenças. As tags de HTML precisar estar contidas dentro de hierarquias e no teu exemplo voce não montou uma hierarquia de registros(TR) contendo campos(TD) e sim vários(TR) cada um contendo um unico (TD) e o resultado é que voce nunca vai entender o que estará vendo pois tudo aparecerá em-baixo um-do-outro numa lista imensa sem que seja possivel detectar a qual coluna pertence o dado mostrado.

Reveja meu código, trabalho dentro dele e refaça os testes.

Usando tabelas dBase com PHP

MensagemEnviado: 04 Set 2013 00:49
por cjp
Entendi, meu caro.

Corrigindo, ficou assim:

<?
$txtEstado = $_POST["Compr"];

$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 = '".$txtEstado."'";
echo $dns;
$rs=odbc_exec($conn,$sql);
if (!$rs)
   {exit("Error in SQL");}

      echo "<table><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 "</table>";
?>


Mas ainda está aparecendo todos os registros. E logo em seguida está dando erro na página.

Ainda está errado?

Usando tabelas dBase com PHP

MensagemEnviado: 04 Set 2013 01:53
por rochinha
Amiguinho,

Qual o provedor que voce está usando?
Qual a URL de acesso ao seu teste, exemplo: http://www.meudominio.com.br/listadb.php(mas a original)

Anexe o .DBF aqui.

Vou testar amanhã.

Usando tabelas dBase com PHP

MensagemEnviado: 04 Set 2013 07:51
por Toledo
Amigos, para ser sincero nunca fiz testes com acesso a arquivos DBF em script PHP, meu forte é MySQL. Mas pelo que pude observar, a sintaxe da query de busca é a mesma, então vou fazer uma pequena observação.

Inácio, quem olha o seu código dá a entender que o conteúdo da variável $txtEstado será a sigla de algum Estado (SP,PR,RJ, etc), mas pelo que pude observar no seu site (http://www.inaciocarvalho.com.br/filtrar.php) o conteúdo do campo "compr" é uma string longa que não tem nada a ver com sigla de estado. Então, pela lógica, fica praticamente impossível utilizar o operador = (igual) para se fazer o filtro.

Bom, como já disse, não tenho experiência com arquivos DBF com PHP, mas em uma query SELECT quando não existe nenhum registro que satifaz o filtro, a query teria que retornar vazia. Não sei se o problema está no operador =, mas se o conteúdo do campo compr for mesmo uma string longa, o correto então seria utilizar o operador LIKE no SELECT:

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


Abraços,

Usando tabelas dBase com PHP

MensagemEnviado: 04 Set 2013 17:21
por cjp
De fato, Toledo, o campo "compr" é um campo caracter com 254 posições.

Eu usei a varíavel txtEstado para manter o exemplo que o Rochinha havia postado, fazendo o mínimo de alterações possível nele, pois não entendo muito de php, evitando assim erros.

Tentei fazer do jeito que vc mencionou, com like, mas continua aparecendo todos os campos da base.

Será que estou fazendo algo errado?

A propósito, será que seria mais fácil eu trabalhar com MySQL? Não entendo nada disso. É fácil transformar uma base de dados DBF em MySQL? E dá pra usar MySQL nos meus programas feitos em Harbour?

Usando tabelas dBase com PHP

MensagemEnviado: 11 Set 2013 00:45
por cjp
Pessoal, por favor, me ajudem. Alguma luz para resolver este problema?

Usando tabelas dBase com PHP

MensagemEnviado: 11 Set 2013 07:38
por Toledo
cjp escreveu:Tentei fazer do jeito que vc mencionou, com like, mas continua aparecendo todos os campos da base.
Será que estou fazendo algo errado?

Inácio, como já lhe disse, eu não tenho nenhuma experiência com uso de arquivos DBF com PHP, então não sei o que pode estar de errado.

cjp escreveu:A propósito, será que seria mais fácil eu trabalhar com MySQL? Não entendo nada disso.

Bom, se com DBF já está complicado, então com MySQL o trabalho será dobrado e você vai depender 100% de ajuda, visto que você "não entende nada disso". E o fora o MySQL, você terá que ter uma boa base de conhecimento de PHP, que também é meio complicado.

cjp escreveu:É fácil transformar uma base de dados DBF em MySQL?

Para converter DBF para MySQL, basta entrar em algum site de busca (Google, Yahoo, etc) e fazer uma busca por "dbf to mysql" ou "dbf to sql", que você vai encontrar varios programas que fazem este tipo de conversão.

cjp escreveu:E dá pra usar MySQL nos meus programas feitos em Harbour?

Sim, veja a pasta \contrib\hbmysql do seu Harbour.

Abraços,

Usando tabelas dBase com PHP

MensagemEnviado: 11 Set 2013 16:35
por rochinha
Amiguinho,

Como o Toledo bem explicou, entre dBase e MySQL existem anos luz de avanços e características. O simples conhecimento do dBase e sua linguagem de scripts leva tempo e muita queda de cabelo.

Se voce tem afinidade com xBase e gosta muito do dBase porque sente facilidade de manutenção criação etc, aprender como manusear outros bancos de dados é uma boa, as diferenças são imensas e a curva de aprendizado dependerá do seu tempo disponível.

Eu velejei pelas ondas do Javascript, VBScript, Rubi, PYthon, PHP e ASP e encontrei nos dois últimos facilidades imensas de integrá-los aos meus projetos, mas corri para aprender somente o básico dentro delas como, conectar a uma base, escrever, deletar, recuperar e listar. O resto não me interessou no primeiro momento e com certeza a medida que fosse necessário eu faria uso do "avançado" nestas linguagens.

Trabalhar com dBase é como trabalhar com TXT, está tudo ali é só abrir e mexer.

Usar MySQL, SQL Server, etc exige um conhecimento desde a instalação, onde se deve configurar, modo de acesso, TCP, PIPE, etc, usuários e senhas, permissões e privilégios.

PHP e ASP exigem também o conhecimento de instalação e configuração e são feitas somente pelo lado do servidor, ou seja, pelo técnico de sua hospedagem ou se estiver instalado em sua máquina pelos programas administradores de manutenção do servidor WEB que deve saber que irá rodar e reconhecer estes scripts e seus módulos.

Eu sempre usei Windows Server, pelo fato de o mesmo possuir servidores WEB que eu possa configurar para o meu uso. No caso de ASP uso o servidor do próprio S.O. e no caso do PHP uso o MiniServX o qual para rodar e reconhecer dBase com os exemplos do inicio deste tópico rodaram muito bem.

Os exemplos onde fiz uso de conecção ODBC para ajudá-lo foram testados e rodam em um pequeno aplicativo em uso em um cliente usando o bom e velho dBase suportador pelo .PHP. Por sorte minha hospedagem é muito boa, o suporte é rápido e a configuração impecável.

Assim como um médico não é possivel diagnosticar uma doença sem VER o paciente, por isto, em post anterior PEDI que enviasse seu .DBF e o SEU script para que eu pudesse delinear o código para voce.

Ao desenhar o aplicativo para meu cliente, não havia hipótese de usar outro banco de dados, eu precisava que fosse dBase para não fazer muitas modificações no retaguarda e acabei por desenhar e colocar para rodar a mesma versão do aplicativo usando ASP e PHP e por fim coloquei no ar a versão PHP. Apesar de achar ASP mais bonito.

Então, o que vc está esperando?

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 00:16
por cjp
Desculpe, meu caro, mas eu achei que vc já tinha acessado a base no meu site. Mas então aí vai ela.

Mas este é apenas um exemplo, pois eu gostaria de fazer o mesmo com várias bases.

O que eu preciso é muito simples: filtrar a base, para permitir ao usuário escolher campos que contenham apenas determinadas palavras.

De fato eu acho que não vou conseguir tempo para aprender a usar MySQL. E talvez nem seja necessário. Creio que seja possível fazer isso com a base em DBF mesmo, com a ajuda de vocês.

Desde já agradeço.

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 00:24
por rochinha
Amiguinho,

Olharei.

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 00:40
por cjp
Muito obrigado.

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 11:29
por rochinha
Amiguinhos,

Conforme os exemplos abaixo foi possivel coletar e filtrar conteúdo da base a partir do que for passado como parâmetros.

Linha de comando 1: http://localhost:60080/agcom/?filtro=PRO
<?
$txtFiltro    = $_GET["filtro"];

$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."%'";
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>";
?>


Linha de comando 2: http://localhost:60080/agcom/?filtro=PRO&categoria=Artigos
<?
$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>";
?>


O conteúdo passado para pesquisa nos parâmetros devem estar de acordo com o existente nos campos da base. Se estiverem nos campos da base em maiúsculas os dados dos parâmetros devem ser passados em maiúsculas ou vice-versa.

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

Mais dicas de comandos

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 18:30
por cjp
Tentei das duas formas, e em ambas continua aparecendo todos os campos da base.

Será que estou fazendo algo errado? Ou quem sabe o problema é no meu site?

Se vc puder testar diretamente no meu site (www.inaciocarvalho.com.br - Área jurídica - Área restrita; usuário: estagiario; senha: mppr), agradeceria.

Usando tabelas dBase com PHP

MensagemEnviado: 18 Set 2013 19:59
por rochinha
Amiguinho,

Você colou o meu post todinho no seu .PHP? Nem chegou a verificar se as variaveis do seu AGENDA.PHP deveriam ser trocadas?

Eu te enviei 2 códigos exemplos:

- o primeiro precisa somente de um campo para pegar parte do que voce precisa.
- o segundo precisa de dois campos onde voce ira inserir o trecho que voce quer pesquisar e a categoria.

Agenda.htm
<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>


Filtrar.php
<?
$txtFiltro    = $_POST["filtro"];

$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."%'";
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>";
?>


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

Usando tabelas dBase com PHP

MensagemEnviado: 22 Set 2013 23:40
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:

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

Usando tabelas dBase com PHP

MensagemEnviado: 23 Set 2013 08:29
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:
$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,

Usando tabelas dBase com PHP

MensagemEnviado: 23 Set 2013 16:32
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.

Usando tabelas dBase com PHP

MensagemEnviado: 29 Set 2013 00:34
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.

Usando tabelas dBase com PHP

MensagemEnviado: 15 Out 2013 00:36
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:

<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).

Usando tabelas dBase com PHP

MensagemEnviado: 15 Out 2013 09:41
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.

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

Usando tabelas dBase com PHP

MensagemEnviado: 15 Out 2013 13:36
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.

Usando tabelas dBase com PHP

MensagemEnviado: 15 Out 2013 16:44
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"?

Usando tabelas dBase com PHP

MensagemEnviado: 19 Out 2013 11:04
por cjp
Caro Rochinha,

Vc saberia me informar se existe alguma função que retorne os campos da base de dados aberta?

Usando tabelas dBase com PHP

MensagemEnviado: 22 Out 2013 07:26
por rochinha
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

Usando tabelas dBase com PHP

MensagemEnviado: 22 Out 2013 22:10
por cjp
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.

Usando tabelas dBase com PHP

MensagemEnviado: 23 Out 2013 00:42
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!

Usando tabelas dBase com PHP

MensagemEnviado: 23 Out 2013 14:46
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.

Usando tabelas dBase com PHP

MensagemEnviado: 23 Out 2013 17:36
por rochinha
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.

Usando tabelas dBase com PHP

MensagemEnviado: 26 Out 2013 00:08
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.

Usando tabelas dBase com PHP

MensagemEnviado: 08 Abr 2014 22:56
por Zombie
Galera, tudo bom? sei que o post é antigo e tal, mas to com uma duvida cruel aqui e faz tempo que to quebrando a cabeça pra resolver e nada, sou iniciante ainda nao manjo muito, bom vou explicar,

meu sisteminha php lê um arquivo dbf e mostro ele na tela, porem eu preciso alterar alguns dados exemplo

* meus campos tem

nome, sobre nome, idade, endereço, cidade, etc

e são varios registro, dai quero localizar um atraves do que mostro na tela, e alterar ou incluir algum dado que esta faltando.

como posso fazer isso no php? inserir dados no dbf usando php?

obrigado de coração desde já

abs

Usando tabelas dBase com PHP

MensagemEnviado: 09 Abr 2014 18:00
por rochinha
Amiguinho,

Parece que voce já entrou no trem na penúltima estação. Mas o trem vai volta e portanto pegue carona no primeiro post do tópico para ver alguns exemplos de manuseio dos comandos.

Se voce já lista, abre a tabela etc é porque já tem configurado o módulo em seu servidor web local.

Veja a lista de comandos existentes neste módulo:
dbase_add_record -- Adiciona um registro a um banco de dados dBase
dbase_close -- Fecha um banco de dados dBase
dbase_create -- Cria um banco de dados dBase
dbase_delete_record -- Exclui um registro de um banco de dados dBase
dbase_get_header_info -- Retorna informações do cabeçalho de um banco de dados
dbase_get_record_with_names --  Obtem um registro apartir de um banco de dados dBase em uma matriz associativa
dbase_get_record -- Obtem um registro apartir de um banco de dados dBase
dbase_numfields --  Retorna quantos campos existem em um banco de dados dBase
dbase_numrecords --  Retorna quantos registros existem em um banco de dados dBase
dbase_open -- Abre um banco de dados dBase
dbase_pack -- Apaga permanentemente os registros do banco de dados dBase
dbase_replace_record -- Substitui um registro em um banco de dados dBase


Como voce pode ver não tem um comando Seek ou Locate mas voce pode usar o comando dbase_get_record() onde voce define o numero do registro fisico do mesmo.

Em sua lista, inclua uma coluna contendo o numero do registro ou sequencial. Esta informação numérica deverá ficar em formato de link, onde o link executará o comando dbase_get_record(..., numeroDoRegistro ) e depois capturar todos os dados para então preencher os campos que irão receber manutenção.

Pela existencia de poucos comandos voce deve avaliar o uso pesado, pois o .ASP e o .PHP são poderosos o bastante para manipular qualquer base de dados. Mas convenhamos que quebra um galho.

Graças a Deus o tópico permite falar do uso de tabelas dBase por PHP usando não só os comandos nativos como por ODBC.

Analise todos os posts, tire conclusões e dê sugestões.

Usando tabelas dBase com PHP

MensagemEnviado: 09 Abr 2014 18:39
por Zombie
Amigo, agradeço pela resposta desde já!!! :)) :))

bom meu codigo segue abaixo para você ter uma ideia do que to fazendo, não entendi muito bem a forma que vou pegar esse registro do dbf,
estou lendo os post novamente e fazendo uns testes aqui para ver se consigo, até agora nao consegui nada ainda... :'(

pelo que entendi, eu tenho que criar no dbf um campo em formato de link esse campo tem que ser sequencial (numerico) isso? nao me xinga que sou novo ainda nisso, rs :%

Meu codigo

//Arquivo DBF
$dbname = "teste.dbf";

//Abre o banco de dados Dbase - 0 – somente leitura, 1 – somente escrita, 2 – leitura/escrita
$con = dbase_open($dbname,2) or die("Erro na Conexão com o arquivo DBF");

//Retorna quantos registros tem no banco de dados
$rows = dbase_numrecords($con);

//Lista os dados da Tabela
for($i=1;$i<=$rows;$i++) {
  $registro = dbase_get_record($con,$i);

print $registro[0]; // codigo unico exemplo 0120145, os numeros não se repetem.
print $registro[17]; //nome
print $registro[18]; //idade
print $registro[19]; //cidade

}

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 01:28
por rochinha
Amiguinho,

tem que ser sequencial (numerico) isso?


Esse é o praxe. Este numero sequencial deverá ser usado como link para a busca do registro, estilo:
for($i=1;$i<=$rows;$i++) {
     $registro = dbase_get_record($con,$i);

     echo "    <a href=AlteraRegistro.php?registro=" . $registro[0] . ">" . $registro[0] . "</a>\n";

     print $registro[17]; //nome
     print $registro[18]; //idade
     print $registro[19]; //cidade
}

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 09:27
por Zombie
rs, agora entendi o que você quis dizer "em formato de link" rs.

bom no meu dbf eu criei uma tabela sequencial, agora eu dou um print nela junto com os outros campos....

preciso saber todas as colunas que tenho no dbf, ou posso alterar somente uma coluna do DBF, exemplo altero somente o nome ?

esse "AlteraRegistro.php" eu vou mandar pra pagina o numero do registro.

dentro dessa pagina "AlteraRegistro.php eu pego

$registro = $_GET ['registro'];

$db = dbase_open('teste.dbf', '2');

... como funciona essa parte ?

if (!dbase_replace_record($db, ???, ???)) {
  print 'Não foi possível alterar registro no banco de dados';
}
dbase_close($db);


obrigado desde já pela atenção :)Pos

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 10:20
por rochinha
Amiguinho,

Veja o funcionamento do passo 10 do primeiro post.

Voce devera criar um form e dentro dele colocar os input para cada campo que deseja pegar informações e o conteudo de cada campo jogar no parametro value.

Algo como:
echo "<FORM ..."
for($i=1;$i<=$rows;$i++) {
        $registro = dbase_get_record($con,$i);
   
        echo "    <input value=" . $registro[0] . ">\n";
   }
echo "</FORM>

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 10:45
por Zombie
Então, até ai eu entendi, eu crio um form, pego os dados, e mando eles para a pagina de alteração, e la na pagina pego todos os dados que quero alterar, o que não to conseguindo fazer é nessa pagina de alteração, como vou alterar? como fica essa pagina?

outra duvida é se altero somente o nome, o restante dos dados permanecem no dbf normal? para o registro alterado?

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 11:17
por rochinha
Amiguinho:

Faça mais ou menos assim:
$registro = dbase_get_record($con,$i);
echo "<FORM action=SalvarRegistro.php ..."
echo "           <input value=" . $registro[8] . ">\n";
echo "           <input value=" . $registro[3] . ">\n";
echo "           <input value=" . $registro[4] . ">\n";
echo "           <input value=" . $registro[9] . ">\n";
echo "</FORM>


No SalvaRegistro.php voce salva somente os registros apresentados no FORM.

Usando tabelas dBase com PHP

MensagemEnviado: 10 Abr 2014 11:40
por Zombie
Amigo, deu certo aqui, AGRADEÇO E MUITO PELA PACIÊNCIA E AJUDA, vlwwww mesmo :{ :)Pos :)Pos :-Y :-Y

se alguem precisar chama ai que o que puder ajudar, to aqui.

abssss

Usando tabelas dBase com PHP

MensagemEnviado: 22 Abr 2014 11:50
por Zombie
rochinha ficou com saudades? rs

brincadeira, kra me tira uma duvida, após alterar um registro no dbf, eu consigo atualizar ele? exemplo alterar e logo após atualizar?

eu consigo alterar tudo certinho porem depois quando abro no pelo FoxPro ele da um erro de codificação e erro de índice dai quando eu organizo eu perco o que eu alterei.

vlwwww

Usando tabelas dBase com PHP

MensagemEnviado: 22 Abr 2014 15:29
por rochinha
Amiguinho,

O tratamento de .DBF pelo .PHP não leva em consideração arquivos de indice. Portanto se voce deseja visualizar o arquivo alterado por .PHP no FoxPro deverá reindexar.

Para uma melhor performance ou tratamento de indices voce deverá utilizar abertura de .DBF por meio de ODBC, pois os comandos dBase para .PHP são básicos demais e não oferecem maior estrutura.

Usando tabelas dBase com PHP

MensagemEnviado: 17 Mai 2014 11:53
por cjp
Amigos,

Estou precisando de ajuda novamente nesta questão: estou tentando criar uma tabela dBase em PHP, mas está dando o seguinte erro:

PHP Warning:  dbase_create() [<a href='function.dbase-create'>function.dbase-create</a>]: Unable to create database (13): Permission denied in C:\Inetpub\Wwwroot\inaciobr\criarec.php on line 28


Minha função está assim:

<html>
<head>
  <title>Criando recado</title>
</head>
<body>
<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
echo $dsn;
$conn= odbc_connect($dsn,"","");
echo $dsn;
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else
echo "Conectado";

sleep(5);
// definindo a estrutura
$estruct = array(
  array("recado", "C", 240),
  array("resposta", "C", 240),
  array("data", "D"),
  array("hora", "C", 8),
);
$nmbase = "rec"+date("H:i");
echo $nmbase;

// criando o banco de dados
if (!dbase_create($nmbase, $estruct)) {
  print "O banco de dados não pode ser criado.";
}

?>


Será que estou fazendo algo errado?

Usando tabelas dBase com PHP

MensagemEnviado: 17 Mai 2014 18:05
por Toledo
cjp escreveu:Será que estou fazendo algo errado?

$nmbase = "rec"+date("H:i");
echo $nmbase;

No código acima você está mostrando qual será o nome do arquivo. Qual é o nome do arquivo?

Lembrando, que no nome do arquivo não pode conter caracteres especiais, apenas letras e números são permitidos. E também a pasta onde será criado o arquivo tem que ter permissão para gravação, então verifique com o suporte do seu servidor qual o procedimento para dar permissão de gravação para a pasta.

Abraços,

Usando tabelas dBase com PHP

MensagemEnviado: 17 Mai 2014 19:04
por cjp
Na verdade esse nome da base era apenas um teste que eu estava fazendo. Quero arrumar um jeito em que o nome da base varie em cada caso, por isso pensei em usar a hora atual como complemento do nome da base a ser criada, para diferenciá-la de outras.

Mas mesmo usando um nome fixo (recado), não está funcionando. Ainda está dando "Permission denied". Então, deve ser a outra questão que vc citou: falta de permissão para gravar na pasta. O estranho é que eu consigo salvar arquivos nessa mesma pasta (/meusarq/agenda) sem problema, tanto pelo FTP do Windows quanto pelo DOS ou pelo Harbour. Será que precisa de uma autorização especial para criar arquivos da forma como estou fazendo aqui?

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mai 2014 01:51
por cjp
Caros colegas,

Resolvi a questão no provedor e funcionou a criação da base.

Agora estou tentando adicionar um campo à base criada, mas está dando o seguinte erro:

PHP Warning:  dbase_add_record() [<a href='function.dbase-add-record'>function.dbase-add-record</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\criarec.php on line 29
PHP Warning:  dbase_close() [<a href='function.dbase-close'>function.dbase-close</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\criarec.php on line 31


A minha função está assim:

<html>
<head>
  <title>Criando recado</title>
</head>
<body>
<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else
//echo "Conectado";

// definindo a estrutura
$estruct = array(
  array("recado", "C", 240),
  array("resposta", "C", 240),
  array("data", "D"),
  array("hora", "C", 8),
);
$nmbase = "recU".date("i").date("s").".dbf"; //+date("H:i");

echo '<br>';

// criando o banco de dados
dbase_create("tarefas/marina/".$nmbase, $estruct);
dbase_open("tarefas/marina/".$nmbase, 2);
$registro = array("testando 1 2 3", "   ", date("d/m/y"), date("H:i:s"));
dbase_add_record("tarefas/marina/".$nmbase, $registro);
echo "Recado criado com sucesso";
dbase_close($nmbase);

?>


O erro está dando na linha 29, que é esta:

 dbase_add_record("tarefas/marina/".$nmbase, $registro);


E na linha 31, que é esta:

 dbase_close($nmbase);


Tem algo errado no meu código?

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mai 2014 02:33
por rochinha
Amiguinho,

Pelo que pude notar voce esta criando o nome da tabela on-the-fly usando concatenação. Ocorre que pode acontecer da contatenação acrescentar algum caractere ao nome que seja proibitivo a criação do mesmo como, espaços.

Preveja antes quais os resultados das variaveis de concatenação para sanar o problema.

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mai 2014 10:51
por cjp
A concatenação a que vc se refere é o fato de a base estar sendo criada em uma subpasta? Se for isso, a base está sendo criada corretamente na subpasta esperada, e também estou abrindo (sem problema) a base na subpasta correta. Por que então não seria possível adicionar um campo nessa base?

Ou vc fala de concatenação por estar a base sendo criada com um nome diferente a cada vez? Se for isso, da mesma forma, a base está sendo criada com o nome esperado, também está sendo aberta essa mesma base.

Ou então eu não entendi o que vc quis dizer com concatenação.

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mai 2014 17:11
por cjp
Apenas para confirmar, fiz sem nada disso, mas continua dando o mesmo erro.

Confira:

<html>
<head>
  <title>Criando recado</title>
</head>
<body>
<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else
//echo "Conectado";

// definindo a estrutura
$estruct = array(
  array("recado", "C", 240),
  array("resposta", "C", 240),
  array("data", "D"),
  array("hora", "C", 8),
);
$nmbase = "recado.dbf"; //"recU".date("i").date("s").".dbf"; //+date("H:i");

echo '<br>';

// criando o banco de dados
dbase_create($nmbase, $estruct);
dbase_open($nmbase, 2);
$registro = array("testando 1 2 3", "   ", date("d/m/y"), date("H:i:s"));
dbase_add_record($nmbase, $registro);
echo "Recado criado com sucesso";
dbase_close($nmbase);

?>


O erro tá assim:

PHP Warning:  dbase_add_record() [<a href='function.dbase-add-record'>function.dbase-add-record</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\criarec.php on line 29
PHP Warning:  dbase_close() [<a href='function.dbase-close'>function.dbase-close</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\criarec.php on line 31


Detalhe: conferi que o arquivo foi realmente criado.

O que seria o "identifier 0" referido no erro?

Usando tabelas dBase com PHP

MensagemEnviado: 25 Mai 2014 13:39
por rochinha
Amiguinho,

Concatenção é o termo usado para demonstrar a união de palavras para formar uma só, exemplo "Jose" + space(1) + "Carlos" é uma concatenação.

Verifique o resultado da que voce está criando.
Acrescente alguma função que retorne o diretório relativo(Relative Path) de seu website, exemplo RelativePath() . "\inaciobr\" . $NomeDBF pode retornar C:\Inetpub\Wwwroot\inaciobr\criarec.php.

Usando tabelas dBase com PHP

MensagemEnviado: 30 Dez 2014 22:40
por cjp
Amigos, vou precisar novamente da ajuda de vocês nesta questão.

Tinha um PHP rodando sem problemas com acesso à base de dados .dbf.

Mas agora meu provedor resolveu fazer alguma modificação no sistema do meu FTP, eu ainda não entendi bem o que eles fizeram, mas, aparentemente, houve modificação no path do FTP, e agora não consigo mais conectar à base de dados.

Meu PHP está assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "compras.dbf";
$txtCampo = "PRODUTO";
$int = "INTERVALO";
$txtP1 = ($_POST["filtro3"]);
$txtP2 = strtoupper($txtP1);
$txtP3 = strtolower($txtP1);
$txtP4 = ucfirst($txtP1);
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$merc1= $_POST['$merc1'];
$merc2= $_GET['$merc2'];
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtArquivo." WHERE ".$int.">0 and (".$txtCampo." LIKE '%".$txtP1."%' OR ".$txtCampo." LIKE '%".$txtP2."%' OR ".$txtCampo." LIKE '%".$txtP3."%' OR ".$txtCampo." LIKE '%".$txtP4."%')";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);

echo "Produtos encontrados:";
echo '<br>';
 
while (odbc_fetch_row($rs))
{
  echo "<tr>";
 
 
  $prd=odbc_result($rs,'produto');

      $tid=odbc_result($rs,'codigo');
     echo "<td><a href='dproduto.php?id=".($tid)."' target='_top'>".$prd."</a></td>";
      echo '<br>';
     echo "Preço máximo: ".$prm; //"<td>$compname2</td>";

echo '<br>';
}
odbc_close($conn);
?>
</body>
</html>


Está dando o seguinte erro:

conexao falhou: [Microsoft][ODBC dBase Driver] '(unknown)' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.

Já conferi que a pasta meusarq existe no FTP, e que a subpasta agenda está dentro da pasta meusarq, e também que o arquivo compras.dbf está dentro da subpasta agenda.

Alguém poderia me ajudar?

Usando tabelas dBase com PHP

MensagemEnviado: 30 Dez 2014 23:11
por rochinha
Amiguinhos,

Em primeiro lugar você precisa usar uma função PHP que retorne a raiz de seu site e outra função para testar a existência de arquivos nesta raiz e subdiretórios.

A invés de usar FTP://WWW.SEUSITE.COM.BR/SUBPASTA use FTP://123.xxx.xxx.xxx/SUBPASTA, ou seja, use o IP de seu site.

Outro fator importante é a verificação de atributos de pastas. Se a pasta selecionada estiver marcada com atributo que impeça a visão ou manutenção dela, provavelmente não será vista por outros meios mesmo que apareça no FTP.

Verifique com seu provedor ou use o painel de controle para fazer tal mudança.

Crie uma nova pasta e neste momento defina seus atributos e passe a trabalhar com ela.

Usando tabelas dBase com PHP

MensagemEnviado: 01 Jan 2015 02:00
por cjp
Fiz o seguinte teste:

echo "A raiz do site é: " . $_SERVER['SERVER_NAME'];
echo "Nome do PHP: ".$_SERVER['REQUEST_URI'];
echo "<br>";
echo $_SERVER['SCRIPT_FILENAME'];


Que retornou:

A raiz do site é: inaciocarvalho.com.brNome do PHP: /constar.php
C:\inetpub\wwwroot\inaciobr\constar.php


Portanto, parece evidente que o problema é na seguinte linha do meu programa:

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";


Eu não sei bem o que é o $_SERVER..., mas ele está retornando um caminho que não existe mais no meu FTP.

Tentei trocar por:

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};"/meusarq/agenda/;";


Mas não funcionou.

Você poderia me dizer como eu devo fazer?

Usando tabelas dBase com PHP

MensagemEnviado: 01 Jan 2015 10:37
por cjp
Descobri depois que o problema estava na pasta MEUSARQ. Mudando a pasta, funcionou.

Obrigado.

Usando tabelas dBase com PHP

MensagemEnviado: 02 Jan 2015 12:36
por JoséQuintas
Não sei se ajuda....
Lembre-se que está rodando seu php no seu servidor.
Não pode inventar qualquer nome de pasta/diretório, porque com certeza vai ter restrições de que pastas pode usar.

Usando tabelas dBase com PHP

MensagemEnviado: 02 Jan 2015 12:55
por cjp
Sim, mas eu já rodava no servidor, e funcionava perfeitamente a abertura da base dentro de subpasta.

O provedor que fez alguma modificação no meu FTP, e por isso a pasta ficou inacessível. Mas, trocando de pasta, já funcionou.

Usando tabelas dBase com PHP

MensagemEnviado: 18 Mar 2015 17:15
por cjp
Meus amigos, novamente preciso da ajuda de vocês com isso. Cada vez que meu provedor faz alguma modificação, este php para de funcionar, e eu não acerto corrigi-lo.

Já testei de todas as formas.

Fazendo este teste:

echo "A raiz do site é: " . $_SERVER['SERVER_NAME'];
echo "<br>";
echo "<br>";
echo "Nome do PHP: ".$_SERVER['REQUEST_URI'];
echo "
";
echo $_SERVER['SCRIPT_FILENAME'];

echo "<br>";
echo "<br>";

$aMat = array(1 => 'CIVIL', 'ADM', 'PENAL', 'CIVIL', 'ADM');
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/teste/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM LEITURA"; // seleciona todos os registros
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}



Está retornando assim:

A raiz do site é: inaciocarvalho.com.br

Nome do PHP: /leitura.php C:\inetpub\wwwroot\inaciobr\leitura.php

conexao falhou: [Microsoft][ODBC dBase Driver] Disk or network error.


Já testei também substituir a pasta por /inaciobr/teste/, mas também não funciona.

Alguém pode me ajudar?

Usando tabelas dBase com PHP

MensagemEnviado: 18 Mar 2015 22:37
por Vlademiro
Amigo,

Já trabalhei em provedor e sempre que acontece alguma mudança no servidor muitas aplicações param de funcionar. Principalmente aquelas que fogem do "feijão com arroz" . No seu caso solicite ao seu provedor que conceda direitos de leitura e escrita nos arquivos dbf pois eles podem ter trocado o HD ou mudado o seu site de local.

Como a sua aplicação não usa o SQL ela mesma deve ter permissões de escrita e leitura no diretório em questão. Isso é a última coisa que um provedor quer, pois requer permissões de escrita e leitura para o usuário que executa seu script php. No linux o nome dele é nobody ou www-data, mas no windows não sei o nome dele. De qualquer forma o seu provedor deve ter que mudar as permissões.

Não fique mechendo na sua aplicação, veja com eles primeiro. Você só deve mecher na sua aplicação se houver uma atualização no php que irá requerer uma nova forma de programar devido a questões de segurança. Isso aconteceu quando o php saiu da sua versão 3 para a 4 e as variáveis globais tiveram que ser registradas... Lembro que os clientes ficaram p* da vida, o provedor deu um prazo para que eles se adequassem.

Usando tabelas dBase com PHP

MensagemEnviado: 19 Mar 2015 10:35
por cjp
Vejam a resposta do provedor:

Olá Inacio,

Primeiramente informamos que não foram feitas alterações no servidor onde seu domínio se encontra hospedado.

Juntamente verificamos as permissões dos arquivos .dbf e os mesmos possuem tais permissão (leitura e escrita).

Sendo assim pedimos que reavalie o problema e, caso possamos ajudá-lo em alguma coisa estaremos a disposição.

Atenciosamente,


Tem algum jeito de testar diretamente se eles estão certos?

Usando tabelas dBase com PHP

MensagemEnviado: 19 Mar 2015 12:34
por rochinha
Amiguinhos,

Este erro tá mais para falta de espaço do que de acesso. Verifique a cota de espaço que voce pode usar, aumente-a.

Veja que o limite de espaço que voce tem no servidor é a soma do espaço para o site MAIS a soma do espaço para bases de dados MAIS a soma do espaço para caixas de e-mail.

Usando tabelas dBase com PHP

MensagemEnviado: 19 Mar 2015 14:47
por cjp
Creio que não seja espaço, pois o site do provedor indica bastante espaço disponível. Veja:

Imagem

Usando tabelas dBase com PHP

MensagemEnviado: 19 Mar 2015 21:17
por Vlademiro
Amigo,

Nesse caso temos que ver todas as causas possíveis, todas mesmo. Por exemplo, no seu script de teste tem :

DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/teste/;";


Veja se :

(1) Se os arquivos DBFs estão na pasta teste

(2) Retire o ponto e vírgula após a barra de teste/ , esse ponto e vírgula era para estar fora somente.

Poste os resultados ! :xau

Usando tabelas dBase com PHP

MensagemEnviado: 20 Mar 2015 22:26
por cjp
Também havia estranhado a / antes das aspas, mas está assim no modelo que peguei aqui. De qualquer forma, testei tirando a /, mas também não funcionou.

E sim, o arquivo LEITURA.DBF existe na pasta TESTE. Veja:

Imagem

O problema, creio eu, deve ter sido a alteração do caminho do site, como ocorreu da vez anterior. Só que não sei como descobrir o caminho correto.

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mar 2015 21:21
por cjp
Amigos, o provedor me passou a seguinte informação, que creio que seja relevante:

Caro Inácio,

Como informado na mensagem anterior, o método utilizado por você necessita que o driver seja especificado exatamente como encontra-se no sistema.

Sua aplicação encontra-se na plataforma 64bits, e sob esta prerrogativa, o driver a ser utilizado deve ser o seguinte:

Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)

Assim, pela lógica, sua string ficaria desta maneira:

$dsn = "DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/ineput/wwwroot/inaciobr/teste/arquivo.mdb";

Pedimos que realize testes utilizando este driver, e caso possua outros problemas, por gentileza nos contate.

Permanecemos à disposição para os esclarecimentos necessários.

Atenciosamente,


Não entendi bem o que seria o arquivo.mdb. Questionei a eles, mas eles não me explicaram convenientemente.

Testei da forma como eles passaram, mas também não funcionou. Só que agora o erro é um pouco diferente:

conexao falhou: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified


Alguém poderia me ajudar?

Usando tabelas dBase com PHP

MensagemEnviado: 21 Mar 2015 23:39
por Vlademiro
Amigo,

Caso ainda esteja com o problema seguem mais algumas ideias :

1 ) A extensão mdb refere-se a um arquivo do MSaccess. Provavelmente quem digitou a resposta se enganou. O correto é dbf.

2 ) Essa mensagem de driver não encontrado eu não posso dizer com certeza. Me parece que eles não efetuaram a instalação do driver para dbase. Eles tem que verificar se realmente a instalação do driver para dbase foi feito.

3 ) O driver pode estar instalado, mas a string de conexão não é essa. Dê uma olhada no site a seguir que tem exemplos de string para dbf

https://www.connectionstrings.com/microsoft-dbase-odbc-driver/

https://www.connectionstrings.com/microsoft-dbase-odbc-driver/standard/

A mensagem de erro que vc informou foi abordada no tópico abaixo, o exemplo é em C# mas a string de conexão é universal.

http://stackoverflow.com/questions/7227711/how-to-connect-to-dbf-database

Já não mecho com ODBC há muitos anos... :%

Se vc conseguiu posta a resposta para que fique arquivado na lista.

Boa sorte :xau

Usando tabelas dBase com PHP

MensagemEnviado: 22 Mar 2015 00:46
por cjp
Não consegui resolver não, meu caro. E não entendi bem os exemplos que vc citou.

Estou achando que será mais fácil mudar essa base de dados para uma tabela no MySQL. Isso eu já sei fazer, e sei que funciona.

Usando tabelas dBase com PHP

MensagemEnviado: 22 Mar 2015 12:58
por Vlademiro
Se não for lhe prejudicar em outro ponto, o mysql é melhor para se trabalhar com php do que o dbf.

E a melhora é sensível porque você não tem o controle do servidor e fica dependendo de terceiros (no caso o provedor).

O exemplos que eu citei estavam relacionados a string de conexão usada pelo ODBC.

O dbf, por ser um arquivo, depende de configurações de ODBC e também de permissões de escrita/leitura que o provedor tem que realizar.

Usando tabelas dBase com PHP

MensagemEnviado: 22 Mar 2015 23:54
por cjp
Bom, eu vou ter que mudar não apenas o PHP, mas também o programa que eu tenho em Harbour, que usa o mesmo arquivo. Vai dar um trabalhinho, mas pelo menos eu sei que dá pra fazer e vai funcionar.

Usando tabelas dBase com PHP

MensagemEnviado: 17 Dez 2020 21:52
por microvolution
Boa noite cjp e demais professores!

Hoje que descobri esse tópico. Que fim deu?

conseguiu fazer funcionar o seu sistema em DBF e usar um navegador pra abrir as tabelas sem atrapalhar ou bagunçar os arquivos?

como a gente não tem nada de android pro harbour e vice-versa, pensei em fazer/aprender um basicão de html ou php pra fazer apenas uma tela de vendas pra q no cliente final, os vendedores no lugar de usar o computador, usem o celular, navegando como se fosse um app/android pra que o(a) vendedor(a) possa realizar e venda de seu próprio celular, e imprima na impressora que quiser (lpt1, usb, etc)...

não sei como fazer, mas, preciso fazer, pois trocar tudo, ainda não é uma possibilidade, em face do custo-benefício.

Uma empresa de desenvolvimento de softwares que possuem "n" clientes, sim, vale o investimento, mas, no nosso caso em particular, não é uma alternativa.

Feliz Jesus a todos, e, que venha 2021, bem melhor pra todos nós!

Usando tabelas dBase com PHP

MensagemEnviado: 17 Dez 2020 23:40
por cjp
Eu desisti disso, estou usando MySQL. E sem dúvida é muito melhor.

Usando tabelas dBase com PHP

MensagemEnviado: 17 Dez 2020 23:46
por rochinha
Amiguinhos,

Atualizando link para baixar o ambiente Apache com mod Harbour: https://www.4shared.com/rar/kF-y_aWTiq/Apache24.html

O mod dBase caiu em desuso e hospedagens online não ativam este recurso. Na época do lançamento do tópico era legal mexer, mas já estava restrito a alguns defeitos.

Usando tabelas dBase com PHP

MensagemEnviado: 28 Dez 2020 11:28
por syslink
rochinha escreveu:O mod dBase caiu em desuso e hospedagens online não ativam este recurso. Na época do lançamento do tópico era legal mexer, mas já estava restrito a alguns defeitos.
uma pena