Uma introdução à classe ADODB

Geralmente nos enganamos ao desenvolver uma aplicação sem pensar no futuro. Não é impossível que o banco de dados que você usa hoje torne-se inviável no futuro e você precise reescrever sua aplicação para utilizar outro banco. É justamente aí que usar uma classe bem desenhada para bancos de dados faz toda a diferença.

[ Hits: 79.184 ]

Por: Pedro César em 01/02/2004


Selecionando, alterando e inserindo registros



Selecionando de um banco de dados


Como qualquer biblioteca bem desenvolvida, como também nas próprias funções do PHP, existem vários caminhos para chegar aos resultados, dependendo do que você planeja, este é um caminho:

<?
$sql = "SELECT nome, idade FROM funcionarios";
$rs = &$db -> Execute($sql);
if (!$rs) {
    print $db ->ErrorMsg(); //Mostra a mensagem de erro se nehum resultado for retornado
} //endif
else {
    while (!rs -> EOF) {
        print $rs -> fields[0].' '.$rs -> fields[1].'<BR>';
        //fields[0] é o nome, fields[1] é a idade
        $rs -> MoveNext(); //move para a proxima linha
    } //endwhile
} //endelse
?>

Neste exemplo, "$rs -> fields" é um array contendo os valores retornados. O índice do Array é numérico por padrão, mas se você quiser pode criar um array associativo para especificar por nome, bastando especificar o modo antes da query, por exemplo:

<?
$sql = "SELECT nome, idade FROM funcionarios";
$rs = &$db -> Execute($sql);
if (!$rs) {
    print $db ->ErrorMsg(); //Mostra a mensagem de erro se nehum resultado for retornado
} //endif
else {
    while (!rs -> EOF) {
        print $rs -> fields['nome'].' '.$rs -> fields['idade'].'<BR>';
        //fields[0] é o nome, fields[1] é a idade
        $rs -> MoveNext(); //move para a proxima linha
    } //endwhile
} //endelse
?>

Uma alternativa para navegar entre os resultados é retornar cada linha como um objeto. ADODB tem uma função chamada FetchNextObject(), ela automaticamente se move para a próxima linha.

<?
$sql = "SELECT nome, idade FROM funcionarios";
$db -> SetFetchMode(ADODB_FETCH_ASSOC); //retornar array associativo
$rs = &$db -> Execute($sql);
if (!$rs) {
    print $db ->ErrorMsg(); //Mostra a mensagem de erro se nehum resultado for retornado
}//endif

//loop através dos resultados
while ($row = $rs -> FetchNextObject()) {
    //o nome do campo precisa ser em maiúsculas
    print $row -> NOME.'  '.IDADE.'<BR>';
}//endwhile
?>

Inserindo e atualizando registros


A inserção básica é rápida e fácil, assim como quando se está selecionando:

$sql = "INSERT INTO funcionarios (nome,idade) VALUES ('Pedro César','25')";
if (!($db -> Execute($sql))) {
    print 'Erro inserindo:'.$db -> ErrorMsg().'<BR>';
}

A vantagem real de usar a biblioteca nesse caso é permitir que você possa inserir os dados em bancos diferentes com a mesma sintaxe, o que normalmente seria impossível, vejam duas situações comuns de ocorrer:

1°) Todas as cotas precisam ter uma saída no caso de erro de sintaxe, mas alguns bancos inserem uma cota simples, outros duas cotas simples, assim ao invés de usar uma função do PHP como addslashes(), com muitos modos de ser usada, você pode usar a qstr() da ADODB para pegar uma string e retorná-la corretamente formatada para usar no banco de sua preferência.

2°) Em relação as datas, muitos bancos aceitam muitos e incompatíveis formatos. ADODB tem uma função chamada DBDate(), que aceita datas em vários Unix Time Stamps ou o formato ISO(Y-M-d) e converte para qualquer formato, de acordo com seu banco. O exemplo seguinte mostra essas duas funções em ação:

$employee_surname = $db->qstr("d'Angelo");
$arrival_tim = $db-> DBDate(time());
$sql = "INSERT INTO employee_arrival(arrival_time,surname) VALUES ($arrival_time,$employee_surname)";
if (!($db->execute($sql))) {
    print "Erro inserindo:".$db->ErrorMsg()."<br>";
}

Você atualiza exatamente pelo mesmo caminho, por exemplo:

$sql = "UPDATE employees SET idade='44' WHERE id='121'";
if (!($db->execute($sql))) {
    print "Erro Atualizando:".$db->ErrorMsg()."<br>";
}

Sugiro para quem quer se aprofundar no assunto ir até http://php.weblogs.com, pois lá tem muita informação valiosa.

Página anterior     Próxima página

Páginas do artigo
   1. Uma introdução à classe ADODB
   2. Conectando à sua base através de scripts
   3. Selecionando, alterando e inserindo registros
   4. Cacheando suas queries
   5. Manipulando os resultados
Outros artigos deste autor

Dicas simples para dar mais usabilidades aos formulários

Uma introdução à biblioteca GD

Utilizando PEAR

Paginação de resultados com a classe ADODB

Leitura recomendada

Configurando Apache + MySQL + Manipulação de dados com PHP

Servidor Web com Fedora Core 7

Stored Procedures usando o MySQL e PHP

PDO - Introdução e conceitos

Executando comandos DML em base de dados MySQL através do Eclipse PHP (Bônus: Temas e Fontes no Eclipse)

  
Comentários
[1] Comentário enviado por fabio em 01/02/2004 - 02:11h

Muito interessante essa classe, com certeza irei experimentá-la em meu próximo projeto. Parabéns!

[2] Comentário enviado por wilbil em 01/02/2004 - 18:31h

acheu muito interessante!

mas ate hoje nunca vi uma classe qua funcionasse os relacionamentos somente selects simples

ja tentou usar inner join do mysql nestas sua classe????

[3] Comentário enviado por tecdom em 01/02/2004 - 20:25h

Nao, mas farei o teste e postarei o resultado.

Obs: Gostaria de deixar claro para todos uma coisa que nao deixei no artigo, que a classe nao e minha. Apenas traduzi um artigo que encontrei na internet . O original encontra-se em: http://www.databasejournal.com/features/mysql/article.php/2222651.
Farei restante da traducao.

[4] Comentário enviado por oalexandrino em 02/02/2004 - 17:18h

"mas ate hoje nunca vi uma classe qua funcionasse os relacionamentos somente selects simples

ja tentou usar inner join do mysql nestas sua classe???? "

Claro, as queries são executadas nas funções nativas PHP daquele banco, acontece que o user nao tem ciência disso...

Utilizo-a e já testei em MySQL, Access e SQL 2000 e o mesmo codigo funciona perfeitamente...talvez seja a classe mais completa desse estilo...

é realmente IMPRESSIONANTE!

[5] Comentário enviado por oalexandrino em 02/02/2004 - 17:21h

Nota...é sempre bom utilizar
"$db -> SetFetchMode(ADODB_FETCH_ASSOC); //retornar array associativo"

pois em SQL Server por exemplo, o array inteiro nao foi acessado, apenas o associativo.. (SQL SErver 2000)

[6] Comentário enviado por fabio em 09/02/2004 - 14:34h

O link correto para download dessa classe é:
http://php.weblogs.com/adodb#downloads

[7] Comentário enviado por fabio em 23/03/2004 - 17:10h

Bom, lá vai uma dica para o uso dessa classe. No PHP temos a função mysql_insert_id(), que retorna o código do último registro inserido no banco de dados. Precisei fazer isso usando a classe ADODB e descobri que ela possui suporte a esse recurso:

$sql = $db->execute("INSERT INTO table (column1, column2) VALUES ('value1', 'value2')");
if(!$sql){
echo "Error performing query: ".$db->ErrorMsg();
} else {
echo "Query success! The new row has an id of: ".$db->Insert_Id();
}

Encontrei essa informação em:
http://www.phpfreaks.com/tutorials/110/2.php
(ADOdb: Making MySQL Efficient)

O artigo do link acima ainda possui muitas outras dicas sobre recursos do MySQL inclusos nessa classe, vale à pena ler :)

[8] Comentário enviado por rockedsonbr em 11/01/2005 - 14:50h

Boa tarde, cara gostaria de saber mais detalhes sobre a classe do AdoDB... pois aqui no teu artigo, vc diz q o adodb suporta conexão com o interbase. Eu baixei o adodb do souceforge, instalei e fiz um texte o resultado foi que ele não conseguiu achar a classe.

Missing file: c:\arquivos de programas\easyphp1-7\www\adodb/drivers/adodb-interbase.inc.php

ADONewConnection: Unable to load database driver ''

obrigado
Rock


Contribuir com comentário