Página 1 de 7

Usando tabelas dBase com PHP

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

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

Código: Selecionar todos

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

Enviado: 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 ";":

Código: Selecionar todos

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

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

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

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

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

Código: Selecionar todos

; extension=php_dbase.dll
Para

Código: Selecionar todos

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

Código: Selecionar todos

; extension=php_dbase.so
Para

Código: Selecionar todos

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

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

Código: Selecionar todos

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:

Código: Selecionar todos

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

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

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

Código: Selecionar todos

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

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

Código: Selecionar todos

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

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

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

Código: Selecionar todos

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

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

Usando tabelas dBase com PHP

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

$dsn = "DRIVER={Driver da Microsoft para o dBase (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
A tabela deverá estar na mesma pasta do script.