# Aplicativos em PHP/Abstrações de Bancos de Dados/AdoDB
## Introdução

ADOdb (Active Data Objects DataBase) é uma abstração de bancos de dados para PHP. Também oferece uma versão para Python.
Atualmente suporta diversos SGBDs: MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL, FrontBase, Interbase (Firebird and Borland variants), Foxpro, Access, ADO e ODBC.
Via ODBC podemos também conectar com diversos SGBDs: Progress, SQLite, DB2 e outros.
É uma das mais ricas e eficientes abstrações existentes para PHP atualmente.
Caso não se utilize uma abstração no código, ao migrar para outro SGBD o código sofrerá diversas alterações e além disso exigirá o conhecimento das funções de ambos os SGBDs, mas utilizando algo como ADOdb a alteração será apenas nos dados da conexão sem necessidade de conhecer as funções do PHP com os SGBDs.

## Exemplo prático para mostrar alguns recursos da ADOdb

Site oficial - http://php.weblogs.com/ADODB
Download - http://adodb.sourceforge.net/#download
Documentações - http://adodb.sourceforge.net/#docs
Este tutorial teve como base os tutoriais do site oficial e também o ótimo tutorial:
PHP Application Development With ADODB
http://www.devshed.com/c/a/PHP/PHP-Application-Development-With-ADODB-part-1/
Banco de Dados para o exemplo: dbbiblioteca
create database dbbiblioteca (com o postgresql mas para usar outro SGBD basta trocar os dados)
Banco - testes
Tabela - biblioteca
Fazer o download e descompactar numa pasta do seu DocumentRoot. Neste exemplo descompactei no raiz.

## Alguns aliases para a conexão

MySQL - mysql
PostgreSQL - postgres
Interbase/Firebird - ibase
SQLite - sqlite
Vamos agora criar alguns scripts PHP para acessar o banco usando ADOdb.
Esta parte inicial se repetirá em todos os scripts, portanto apenas farei a citação de "inicial" nos demais scripts
inicial
ADODB também oferece um número de métodos alternativos para processar um resultset. Por exemplo, você pode receber o resultset como um array associativo indexado de string, onde as chaves são nomes de campos e os valores os correspondentes valores dos campos.
Um exemplo:
inicial - (aqui cole o trecho inicial) referido acima
Você pode usar o método GetAll no lugar do Execute que retorna o resultset completo com um array bidimensional de pares campo-valor. Este array pode então ser processado com um simples "foreach" ou um loop "for".
Um exemplo:
inicial

## Exemplo com as funções RecordCount e FieldCount

inicial
Podemos obter informações sobre cada campo com o método FetchField, que retorna um objeto contendo informações detalhadas sobre as propriedades dos campos, incluindo seus nomes e tipos. Um exemplo:
inicial
Para a execução de consultas INSERT em tabela contendo chave primária com auto-incremento podemos obter o último ID gerado do auto-incremento usando o método Insert_ID. Exemplo:
inicial
Obs.: o método qstr é usado para "escapar" caracteres especiais em consultas com strings.
Quando estamos utilizando consultas que afetam registros de tabelas, como insert, delete ou update o método Affected_Rows retorna o número de registros afetados.
inicial

## Restringir o número de registros recebidos podemos usar o método SelectLimit

inicial
Alerta: Cuidado com o copiar e colar. Este exemplo acima e vários outros acusaram erro ao executar.
Normalmente o erro era na linha (echo $result->fields[1] . " - " . $result->fields[2] . " ";).
O original estava no Write do OpenOffice. Normalmente apenas excluo os espaços antes do echo e tá resolvido ou então redigito apenas a linha do erro.
Algumas vezes precisei remover alguns espaços após o ponto e vírgula.

## Obter uma lista dos bancos e tabelas do SGBD

Através dos métodos MetaDatabases e MetaTables.
inicial

## Quando precisamos executar uma consulta várias vezes

Como por exemplo diversos INSERTs. O ADOdb conta com diversos recursos úteis. Vejamos:
inicial
Atentar para o fato de que o prepare apenas deixa a consulta pronta e o execute finaliza a execução.
Isto melhora muito o desempenho quando temos muitas consultas a realizar.

## Uso de transações

Caso o SGBD tenha suporte:
inicial

## Cache de Consultas

ADOdb tembém oferece suporte para cache de consultas. Que oferece um excelente ganho de desempenho, principalmente nos casos em que precisamos executar uma mesma consulta diversas vezes.
Para ver a diferença abaixo temos uma consulta normal:
inicial
Agora usando o cache de consulta:
inicial
Algo que dá um bom trabalho é criar um select que seja populado de uma tabela. O menu drop-down. O ADOdb tem um método especificamente para esta finalidade.

## Exportar um resultset para diversos formatos

- texto separado por tabulação
- tabela HTML
Estes recursos não fazem parte da classe ADODB, portanto precisaremos importar outras classes.
Podemos suprimir a primeira linha (nomes dos campos), adicionando um parâmetro para a chamada de rs2csv:
// return a CSV string
echo rs2csv($result, false);
Formatando com separador tab: Apenas troque a função (método) de rs2csv para rs2tab.
Formatando a saída para tabela HTML: Para esta precisamos de outro importe, confira:
Formatando Data de Saída
Exporting in CSV or Tab-Delimited Format
$rs->MoveFirst; $fp = fopen($path, "w"); if ($fp) {
INSERT com Arquivo SCV
Arquivo lista.txt

## Debugando

Conectando-se a dois bancos de dados de SGBDs diferentes ao mesmo tempo

## Recordset Filters

Sometimes we want to pre-process all rows in a recordset before we use it. For example, we want to ucwords all text in recordset.
Executing the SQL

## Inserts and Updates

Let's say you want to insert the following data into a database.

## MetaTypes

You can find out more information about each of the fields (I use the words fields and columns interchangebly) you are selecting by calling the recordset method FetchField($fieldoffset). This will return an object with 3 properties: name, type and max_length.
For example:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
Then $f0->name will hold 'adata', $f0->type will be set to 'date'. If the max_length is unknown, it will be set to -1.
One problem with handling different databases is that each database often calls the same type by a different name. For example a timestamp type is called datetime in one database and time in another. So ADODB has a special MetaType($type, $max_length) function that standardises the types to the following:
In the above date example,

## Apresentando a adobDB

Bom artigo do Silas Alves Júnior
http://www.revistaphp.com.br/print.php?id=49