Ciro Feitosa

Blog

PEAR-DB: Abstração de Banco de Dados em PHP

Quinta-feira, 05 de Janeiro, 2006 | 34 comentários | Del.icio.us

Definição do site oficial: PEAR é um framework e sistema de distribuição para reuso de componentes em PHP. Tá difícil de entender? Calma, eu explico.

Este projeto foi criado afim de facilitar a vida dos programadores (e lá vou eu falar novamente de produtividade). A idéia aqui é reusar o que já está pronto, apenas por chamadas de métodos (faz sentido num framework). Os códigos são chamados de pacotes.

Existem dezenas de pacotes para o PEAR. Pacotes para autenticação, manuseio de data e hora, web-services, XML, etc. Mas meu enfoque aqui vai ser justamente no pacote DB, pertencente a categoria banco de dados.

Para que serve o pacote DB?

Como o próprio nome do artigo sugere: abstração de banco de dados. Imagine que você tenha projetado um bom sistema em PHP para rodar com o banco de dados Oracle. Passam meses, e o diretor de projetos te chama e diz que a empresa terá uma corte de gastos, e passará a usar o PostgreSQL. O que você faria para seu sistema rodar no novo banco de dados? Reescreveria tudo do início, correto?

Não, se você tivesse usado o pacote DB.

O que muda de um SGBD para outro, é a forma de tratar os dados e consultas. Claro, eu sei que todos usam a linguagem universal SQL, mas internamente a maneira é diferente.

É aí que entra o pacote DB, afim de criar uma abstração de tratamento. Você informa apenas qual banco de dados irá trabalhar, e ele fica responsável pela conexão, consultas, e tratamento dos dados.

Lista de SGBD's disponíveis pelo DB:

  • dBase
  • FrontBase
  • InterBase
  • Informix
  • Mini SQL
  • Microsoft SQL Server
  • MySQL (para MySQL <= 4.0)
  • MySQLi (para MySQL >= 4.1) (requer PHP 5)
  • Oracle 7/8/9
  • ODBC (Open Database Connectivity)
  • PostgreSQL
  • SQLite
  • Sybase

Utilização

Antes de mais nada, você vai precisar baixar a classe mãe PEAR. Depois, baixe o pacote DB. Com tudo instalado, vejamos exemplos na prática (a cada exemplo seguinte, depende do anterior).

Conexão com Banco de Dados

Conectando ao PostgreSQL:

<?php
require_once 'DB.php';

$dsn = array(
    'phptype'  => 'pgsql',
    'username' => 'nome_usuario',
    'password' => 'senha_usuario',
    'hostspec' => 'host_banco',
    'database' => 'nome_banco',
);

$options = array(
    'debug'       => 2,
    'portability' => DB_PORTABILITY_ALL,
);

$db =& DB::connect($dsn, $options);
if (PEAR::isError($db))
{
    die($db->getMessage());
}
?>

Agora você tem uma instancia em aberto de nome $db. Todas as consultas daqui pra frente terão que se referenciar a ela. Para conectar ao MySQL por exemplo, bastava trocar o índice phptype do vetor para mysql.

Criando consultas

Primeira consulta:

<?php
$sql  = 'select * from produtos where id_produto = ?';
$data = 12;

$res =& $db->query($sql, $data);
// sempre cheque se houve algum erro durante a consulta
if (PEAR::isError($res))
{
    die($res->getMessage());
}
?>

Segunda consulta:

<?php
$sql  = 'select * from produtos where id_pro = ? and situacao_pro = ?';
$data = array(12,1);

$res =& $db->query($sql, $data);

// sempre cheque se houve algum erro durante a consulta
if (PEAR::isError($res))
{
    die($res->getMessage());
}
?>

Tratamento dos resultados

Existem 3 formas diferentes de tratar os dados durante o resultado. Veja a diferença:

DB_FETCHMODE_ORDERED (padrão)

Array
(
    [0] => 28
    [1] => hi
)

DB_FETCHMODE_ASSOC

Array
(
    [a] => 28
    [b] => hi
)

DB_FETCHMODE_OBJECT

stdClass Object
(
    [a] => 28
    [b] => hi
)

Resultados de uma consulta:

<?php
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC))
{
    echo $row['id'] . "\n";
}
?>

Exemplo completo

<?php
require_once 'DB.php';

/**
* Dados gerais sobre o banco de dados
*/
$dsn = array(
    'phptype'  => 'pgsql',
    'username' => 'nome_usuario',
    'password' => 'senha_usuario',
    'hostspec' => 'host_banco',
    'database' => 'nome_banco',
);

$options = array(
    'debug'       => 2,
    'portability' => DB_PORTABILITY_ALL,
);

/**
* Realiza a conexao e instancia
*/
$db =& DB::connect($dsn, $options);
if (PEAR::isError($db))
{
    die($db->getMessage());
}

/**
* Monta a consulta
*/
$sql  = 'select * from produtos where id_produto = ?';
$data = 12;

/**
* Realiza a consulta
*/
$res =& $db->query($sql, $data);
if (PEAR::isError($res))
{
    die($res->getMessage());
}

/**
* Mostra o resultado na tela
*/
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC))
{
    echo $row['id'] . "\n";
}
?>

Documentação

A documentação do DB é ampla e objetiva. Além das explicações sobre cada método, contém também diversos exemplos comuns de uso.

Agora experimente utilizar o PEAR-DB juntamente com o Smarty (leia Smarty e PHP, tudo a ver). Você terá flexibilidade na interface com o usuário e no banco de dados.

34 comentários

Gravatar para Vitor (irmao de Leo)#1 | Vitor (irmao de Leo) disse:

Ciro cara, iai, bom seu site heim!?
Rapaz não li sobre o PEAR em outras fontes, mas sera que ele resolve questoes do tipo:
a sintaxe das consultas de data no sqlserver são de uma forma (nao lembro ao certo, mas pode ser feito algo "SELECT ... FROM ... WHERE dataCadastro = '01/06/2006'"), outros bancos não dao suporte a isso ou implementam de forma diferente (tipo sei la : "SELECT ... FROM ... WHERE dataCadastro = date(06,01,2005)". Usando o PEAR ficaria mais ou menos assim né: "SELECT ... FROM ... WHERE dataCadastro = ?") qual seria entao o valor $data?

Pq se ele não resolver isso, teremos que percorrer o código todo do mesmo jeito para alterar a sintaxe da consulta.
Flw

Gravatar para Ciro#2 | Ciro disse:

Vitor,
Nesse caso se trata de uso de funções próprias do SGBD. Até onde sei, o PEAR-DB ainda não trata esse tipo de coisa, ou seja, você teria que passar a data no padrão usual: AAAA-MM-DD.
Abraço!

Gravatar para Flávio Theruo Kaminisse#3 | Flávio Theruo Kaminisse disse:

Parabéns Ciro,
Excelente artigo, já adicionei no meu del.icio.us como referência.
Abraços.

Gravatar para Robson de Araújo Gomes#4 | Robson de Araújo Gomes disse:

Olá, ciro, parabéns pelo excelente artigo.

kra, tentei executar aqui e deu seguinte erro:

Error DB: extension not found.

o que poderia ser?

Gravatar para Ciro#5 | Ciro disse:

Robson,

Você tem certeza que instalou o DB e o PEAR?
Lembrando que o PEAR não vem no mesmo pacote do DB.
Se você incluiu o PEAR, apontando pra pasta correta, e configurou os dados para o SGBD, não tem porque dar erro.
Veja isso.

Abraço!

Gravatar para Robson de Araújo Gomes#6 | Robson de Araújo Gomes disse:

eita o atendimento aqui é rápido viu...rs isso é bom.

Ciro, eu baixei o pear e DB, e os coloquei dentro da pasta onde está a minha aplicação... /var/www/ antes de eu fazer isso tava dando um monte de erro, aí agora, depois que eu copiei os arquivos só tá dando esse erro. Extension not found. eu tava olhando aqui na net e acho que é algo com a pgsql.so que ele não tá achando... e nem eu ...rs

será?

Gravatar para Ciro#7 | Ciro disse:

Robson,

Por padrão a tal extensão já vem na pasta DB (pgsql.php), mas verifique-a. No mais, você pode tratar melhor o erro, e solucionar teu problema. Dá uma olhada em:
http://pear.php.net/manual/en/package.database.db.db-error.php

Abraço!

Gravatar para Robson de Araújo Gomes#8 | Robson de Araújo Gomes disse:

olha só o erro que tá aparecendo... estou usando o toString();

[db_error: message="DB Error: extension not found" code=-25 mode=return level=notice prefix="" info=" [DB Error: extension not found] ** pgsql://postgres:1234:@localhost/ematerce"]

Gravatar para Adriano Sulino#9 | Adriano Sulino disse:

Muito bom mas não fala nada de como eu faço para conectar com o sql server 2000 preciso deste comando para um projeto

Gravatar para Ciro#10 | Ciro disse:

Adriano,

Você só precisa mudar a linha
'phptype' => 'pgsql'
para
'phptype' => 'mssql'

Mais informações na documentação (sobre DSN): http://pear.php.net/manual/en/package.database.db.intro-dsn.php

Abraço.

Gravatar para Adriano sulino#11 | Adriano sulino disse:

blz vou tentar ... mas estou tendo dificuldades de fazer rodar o php 5 + apache no meu computador o que tenho que fazer, vc faz ideia de onde posso baixar o PHP triends ??

Gravatar para Hélio#12 | Hélio disse:

Qual é a vantagem de sempre usar uma referência em toda atribuiçaõ?

Abraçus,
Hélio

Gravatar para Flavio#13 | Flavio disse:

Ciro,

estou acessandoo SQLServer2000 com o PEAR e seu codigo foi de grande ajuda!

So que nao estou conseguindo \'ler\' os valores retornados.
apesar dele entrar dentro do loop para buscar os valores...o que vc acha q pode ser??

Gravatar para Ciro#14 | Ciro disse:

@ Helio:
O código (usando referência) foi baseado direto da documentação do DB. Os métodos da classe do PEAR-DB são baseados em referências, por isso a necessidade de se usar.

@ Flavio:
Dá uma olhada na seção sobre Tratamento de Resultados: http://pear.php.net/manual/en/package.database.db.intro-fetch.php. Se ele consegue acessar e executar a query, também vai conseguir listar.

Abraço!

Gravatar para Jackson CereB#15 | Jackson CereB disse:

Como faço para instalar o DB em um servidor remoto? Posso apenas incluir a classe?

Gravatar para Ciro#16 | Ciro disse:

Jackson,

Basta você copiar a classe (incluindo o PEAR) para o teu servidor, e fazer chamada dela no seu arquivo PHP.

Abraço!

Gravatar para leandro#17 | leandro disse:

cara como eu faço pra fazer uma conexao entre php e postgree??? eu estou fazendo assim

$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=123456");

mas ta dando esse erro

Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation "usuarios" does not exist in C:\Sites\teste.php on line 5

eu acho q é porque eu criei as tabelas dentro de um schema, como eu faço para acessar esse schema obrigado

me ajudem por favor

leandro

Gravatar para Flavio#18 | Flavio disse:

Galera,
estou com um problema e desconfio que o PEAR pode estar envolvido! Dada a query abaixo, simplesmente nao é retornado nenhum valor (se eu rodar essa query no SQLServer, ela funciona direitinho!). Tentei rodar o mesmo SQL sem a clausula WHERE e ele retorna dados!!!

alguma opiniao???

SELECT idPonto,idPontoPai,strPonto,strFoto,strDescricao,strTexto,strFotoPan,CoordGps,Zoom FROM dbo.Ponto where idPontoPai is NULL and zoom=1

Gravatar para Alexandre dos Santos Dumas Junior#19 | Alexandre dos Santos Dumas Junior disse:

$conn = pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=123456");
Ciro estou com esse mesmo erro como posso resolver muito obrigado.

Parabens pois pesquisei em muitos sites mas somente o seu pode me dar uma luz.


mas ta dando esse erro

Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation "usuarios" does not exist in C:\Sites\teste.php on line 5

Gravatar para Alinson Juchem#20 | Alinson Juchem disse:

Bom Dia ciro!!! Cara, adorei o teu artigo, realmente ele esta muito completo... ainda nao havia encontrado um site tao especifico.... mas... eh o seguinte....
eu tenho o apache + php + mysql rodando na minha maquina e estou tentando montar uma pagina de consulta, a minha pergunta é:
Este codigo funcionará na minha pagina???
Sou novato no assunto e embora esteja pesquisando muito preciso de um apoio profissional... hehe

grande abraco e, novamente, parabens pelo artigo.

Gravatar para Ciro#21 | Ciro disse:

@ Alexandre:
Teu problema não está relacionado ao PEAR-DB, mas à sua arquitetura de banco de dados. Repare no erro: relation usuarios does not exist. Uma relação não existe na sua consulta. Reveja.

@ Alinson:
Sim, o PEAR vai funcionar sem problemas desde que seu servidor Web reconheça o PHP normalmente. Obrigado pelas palavras Smiley

Gravatar para Alinson Juchem#22 | Alinson Juchem disse:

Ciro,
Muito obrigado por responder-me tao depressa!!
Utilizei o codigo no meu php editor, chamei o interpretador e ele me acusou estes 2 errinhos:
Warning main (DB.php): failed to open stream. No such file or directory in C:\navapag\rac_rct2003_2004_temp.htm on line 87
e....
Fatal error main(): Failed on=pening required 'DB.php'(include_path='.;c:\php4\pear') in C:\navapag\rac_rct2003_2004_temp.htm on line 87

Sei q preciso baixar o DB.php mas....
onde consigo ele????
quais os passos para a instalação dele????
aguardo sua resposta....

Grato pela atenção e tenha uma Boa Tarde!!

Gravatar para Alinson Juchem#23 | Alinson Juchem disse:

Bom... acho q esqueci de dizer q estou trabalhando com o Windows 2000.... e o pior é que todos os arquivos q eu baixei são "*.tgz"(*nix).
como farei para encontrar um arquivo que rode no windows???

abraco
e... espero nao estar t alugando d+

Gravatar para Ciro#24 | Ciro disse:

@ Alinson:
Sua primeira dúvida é que você não instalou o pacote DB. Em relação à segunda dúvida: TGZ (TAR.GZ) é um formato de empacotamento. Utilize o WinRAR, por exemplo, para descompactar.

Gravatar para Alinson Juchem#25 | Alinson Juchem disse:

O pearl foi perfeitamente instalado... mas ainda estao aparecendo estes erros:
Warning main(DB.php): failed to open stream: No such file or directory in C:\navapag\rac_rct2003_2004_temp.htm on line 87
e
Fatal error main(): Failed on=pening required 'DB.php'(include_path='.;c:\php4\pear') in C:\navapag\rac_rct2003_2004_temp.htm on line 87

como ja havia falado sou novato e nao entendo o q isso quer dizer...
abraco

Gravatar para Alinson#26 | Alinson disse:

este pacote db-1.7.6 é para windows??? baixei o pacote mas nao consigo instalar.... o windows so pergunta com q programa posso abrir o pacote.

Gravatar para Max#27 | Max disse:

Smiley
blza?
Ciro, Quais as implicações legais sobre o uso deste pacote em softwares que serao licenciados (proprietarios) ou vendidos.?

muito obrigado!

Max

Gravatar para Marcio#28 | Marcio disse:

Cara, muito bom o artigo. Parabéns.
Para o pessoal que ta postando ai, vi diversas dúvidas (a maioria) que não envolve o PEAR, e também muitas dúvidas absurdas relacionadas ao próprio uso \\\'básico\\\' do php. Pessoal, este artigo é sobre PEAR:DB, portanto se você tiver alguam dúvida que não seja isso, verifique em outro lugar, afinal o Ciro já fez demais passando tudo mastigadinho, e principalmente, estudem php, não tentem simplesmente \\\'começar\\\' a programar que não adianta em nada.

Gravatar para WILLIAM#29 | WILLIAM disse:

site de vcs muito bom , sera q vcs poderia me ajudar ESTOU PRECISANDO DE FAZER UMA ENQUETE SEM PRECISAR DE BANCO DE DADOS .

Gravatar para Walter Cruz#30 | Walter Cruz disse:

Há algum tempo o PEAR::DB foi colocado de molho em favor do PEAR::MDB2. Eu traduzi um artigo sobre a migração de um para o outro, disponível em:

http://devlog.waltercruz.com/migrando_do_pear_db_para_o_pear_mdb2

(Ciro, seu blog não aceita trackbaks?)

Gravatar para Silvio Delgado#31 | Silvio Delgado disse:

Olá, Ciro!
Bom artigo!

Uma pergunta: é possível acessar um banco de dados MSSQL remoto (em outro servidor) com o PEAR::DB? Necessita de alguma configuração especial ou basta configurar o DSN?

Agradeço a ajuda!
Um grande abraço.

Silvio Delgado

Gravatar para Milena#32 | Milena disse:

Ciro, estou com o seguinte erro:

Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation \\\\

Gravatar para Rômulo Martins#33 | Rômulo Martins disse:

Ciro,

Se eu for hospedar em um servidor remoto, que eu não tenho acesso as configurações do servidor, nem ao php.ini. Como eu utilizaria o PEAR:DB ???

Gravatar para lineu#34 | lineu disse:

como faço para inserir dados no meu DB que esta postgresql, vc me mostrou como visualizar estes dados e agradeço muito mas como posso inserir dados nela(texto, imagem, data...)

Deixe o seu comentário

As imagens que aparecem são Gravatars. Ao registrar um, sempre que comentar em algum blog que suporte essa funcionalidade, sua imagem aparecerá ao lado. Se você ainda não tem um gravatar, crie aqui.





arrow exclaim question idea biggrin confused cool cry eek evil lol mad mrgreen neutral razz redface rolleyes sad smile surprised twisted wink




English Version © Copyright 2004-2008 Ciro Feitosa - Todos os Direitos Reservados