goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

ADOdb: camada de abstração de banco de dados para PHP – dicas e truques

Post publicado originalmente em http://devfranca.ning.com/profiles/blogs/adodb-camada-de-abstracao-de em 15 de fevereiro de 2010.

Olá, pessoal! Após um bom tempo “sumido”, volto para partilhar com vocês minha experiência com o ADOdb, que é uma camada de abstração de banco de dados para PHP. Muitos de vocês já devem utilizá-lo ou pelo menos ter ouvido falar dele. Nesse caso, espero não ser repetitivo e “chover no molhado”, mas vou tentar passar alguns truques úteis que não se acham facilmente por aí.

O ADOdb encontra-se em desenvolvimento desde o ano 2000, e, embora tenham surgido outras propostas semelhantes (como o PDO), ele continua sendo a mais popular e camada de abstração de banco de dados para o PHP, sendo utilizado em várias aplicações de renome (Mambo, Xaraya, Moodle, etc).

Opa! Camada de abstração de banco de dados? Esse bicho morde?

Não só não morde, como vem em auxílio do desenvolvedor PHP, especialmente nos casos em que:

  • o projeto foi iniciado em um SGBD (digamos, mySQL) e, a partir de um determinado ponto, foi necessário alterá-lo para outro (PostgreSQL ou MS SQL Server, por exemplo);
  • o mesmo projeto necessita acessar dados em SGBDs distintos – no meu caso específico, vivo tendo que fazer mySQL e MS SQL Server conversarem e trocarem dados entre si.

A vantagem mais óbvia de se utilizar uma camada de abstração de banco de dados é ter à mão um conjunto uniforme de classes e métodos para manipular os dados, sem se preocupar com o SGBD no qual os dados estão armazenados. Não seria ótimo utilizar algo como $conexao->Execute() ao invés de ter de lidar com mysql_query() para o mySQL, pg_query() para o PostgreSQL, etc.?

Animado com a ideia? Mãos na massa, portanto. Instalar o ADOdb é tão simples como baixar um arquivo comprimido e descompactá-lo no local de sua preferência, desde que ao alcance de seu servidor Web.

Pois bem. Suponhamos uma tabelinha bem simples, em um banco de dados qualquer, chamada tb_pessoa:

cod_pessoa nome_pessoa
1001 Fulano de Tal
1002 Beltrano da Silva
1003 Sicrano de Souza

Para utilizar o ADOdb e mostrar esses dados numa página, primeiramente precisamos criar uma conexão ao nosso SGBD. Isso é feito da seguinte forma:

include('/caminho/para/ADOdb.inc.php');

$conexao = NewADOConnection('<nome do driver do SGBD>');
$conexao->PConnect('<servidor>', '<usuário>', '<senha>', '<banco de dados>');
$conexao->SetFetchMode(ADODB_FETCH_ASSOC);

Nota-se que, qualquer que seja o SGBD, o esquema de conexão continua o mesmo (há outras formas de criar uma conexão, isso será abordado posteriormente). O que realmente muda é o nome do driver do SGBD. Veja aqui a lista completa dos SGBD suportados pelo ADOdb. Na primeira linha, criamos a conexão, passando como parâmetro o nome do driver que queremos utilizar. Na segunda linha, criamos uma conexão permanente (utilizando PConnect), passando os chamados “quatro parâmetros clássicos”. Ter uma conexão permanente significa dizer que o PHP reutilizará a mesma conexão (contanto que os “quatro parâmetros” mantenham-se os mesmos em diferentes requisições de página) para todos que acessarem sua aplicação, evitando o conhecido problema de estouro do limite do número de conexões. Por fim, na terceira linha instruímos o ADOdb a gerar, para os campos de uma consulta, uma matriz associativa em que as chaves são os nomes dos campos. De outra forma, somente poderíamos acessar o valor dos campos utilizando o índice numérico do campo. Não entendeu bem? Não se preocupe, isso ficará mais claro em breve.

A partir desse ponto, toda e qualquer operação com os dados poderá utilizar os mesmos métodos. O aspecto mais interessante do ADOdb, na minha opinião, é sua característica multiparadigmática,isto é, ele oferece múltiplas formas de se fazer a mesma tarefa. Assim, para gerar uma tabela HTML com os dados de tb_pessoa, é possível utilizar o seguinte trecho de código:

$registros  =  $conexao->GetAll('select * from tb_pessoa');

echo "<table>\n";
for($i = 0; $i < count($registros); ++$i) {
  echo "<tr>\n<td>{$registros[$i]['cod_pessoa']}</td>";
  echo "<td>{$registros[$i]['nome_pessoa']}</td></tr>\n";
}
echo "</table>\n";

O método GetAll retorna todos os registros da query em uma matriz multidimensional, em que a primeira dimensão corresponde ao número do registro (iniciado em 0) e segunda aos dados do registro correspondente.

Quem preferir, pode trocar o for pelo foreach, com as adaptações necessárias:

$registros  =  $conexao->GetAll('select * from tb_pessoa');

echo "<table>\n";
foreach($registros as $reg) {
  echo "<tr>\n<td>{$reg['cod_pessoa']}</td>";
  echo "<td>{$reg['nome_pessoa']}</td></tr>\n";
}
echo "</table>\n";

Por outro lado, aqueles que já trabalharam com o Visual Basic ou com o modelo ADO de acesso a dados (no qual, originalmente, o ADOdb se inspirou), talvez achem mais familiar a seguinte abordagem:

$registros  =  $conexao->Execute('select * from tb_pessoa');

echo "<table>\n";
while(! $registros->EOF) {
  echo "<tr>\n<td>{$registros->fields['cod_pessoa']}</td>";
  echo "<td>{$registros->fields['nome_pessoa']}</td></tr>\n";
  $registros->MoveNext();
}

echo "</table>\n";

Nesse caso, ao invés de GetAll (que retorna uma matriz), foi utilizado o método Execute (que também é utilizado para instruções do tipo INSERT, UPDATE e DELETE), o qual retorna um objeto que representa o conjunto de registros. Este, por seu turno, é percorrido testando-se se foi atingido o final do conjunto (EOF), exigindo uma instrução explícita para a passagem de um registro a outro (MoveNext). O valor dos campos é acessado por meio de da propriedade fields, que se constitui numa matriz associativa cujas chaves são os nomes de cada campo.

Como disse inicialmente, o ADOdb oferece várias abordagens, para que desenvolvedores das mais diferentes formações encontrem a maneira mais familiar de interagir com ele.

Dicas e Truques

  • Quem trabalha com MS SQL Server no PHP pode já ter tido dificuldades para fazer essas duas tecnologias conversarem entre si. Isso porque a biblioteca de acesso ao MS SQL Server nativa do PHP (php_mssql) apresenta severas limitações, já que sua API se baseia na antiquíssima versão 7.0 do SGBD da Microsoft. Contudo, se seu servidor PHP roda sob Windows, podemos instruir o ADOdb a utilizar o driver ADO ao invés da biblioteca PHP, com um pequeno ajuste na instrução de conexão, como segue:
    include('/path/to/ADOdb.inc.php');
    
    $conexao = NewADOConnection('ado_mssql');
    $conexao->PConnect("Provider=SQLOLEDB.1;Network Library=DBMSSOCN;Data Source=<servidor>,1433;Initial Catalog=<banco de dados>;User ID=<usuário;Password=<senha>");
    $conexao->SetFetchMode(ADOdb_FETCH_ASSOC);
    
    

    Na primeira linha, dizemos ao ADOdb para utilizar o driver ado_mssql ao invés do mssql. Na segunda linha, ao invés dos clássicos quatro parâmetros (servidor, usuário, senha e banco de dados), passamos apenas um, contendo a string de conexão ADO, que por sua vez embute os parâmetros requeridos.

  • Além do método GetAll, que retorna todo o resultado da consulta em uma matriz bidimensional, dois outros métodos “irmãos” são também bastante úteis. O método GetRow retorna o primeiro registro do conjunto (ótimo para consultas que só retornam um registro) e o método GetOne retorna o valor do primeiro campo do primeiro registro – perfeito para consultas do tipo select count(*) from tabela.
  • Os métodos GetAll, GetRow, GetOne e Execute podem receber um segundo argumento, que é uma matriz de parâmetros para a consulta. Veja no exemplo:
    $registros = $conexao->Execute('select * from tb_pessoa where nome_pessoa like ? or cod_pessoa > ?', array('Beltr%', 1002));
    

Por hoje é só, gente! Comentários, críticas e sugestões são benvindos.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: