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.