Hi! Do you wanna see the English version?
Quinta-feira, 05 de Janeiro, 2006 | 35 comentários
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.
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:
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).
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.
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());
}
?>
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";
}
?>
<?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";
}
?>
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.
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
Ciro Feitosa 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!
Flávio Theruo Kaminisse disse:
Parabéns Ciro,
Excelente artigo, já adicionei no meu del.icio.us como referência.
Abraços.
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?
Ciro Feitosa 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!
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á?
Ciro Feitosa 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!
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"]
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
Ciro Feitosa disse:
Adriano,
Você só precisa mudar a linha
'phptype' => 'pgsql'
para
'phptype' => 'mssql'
Mais informações na documentação (sobre DSN): <a href="http://pear.php.net/manual/en/package.database.db.intro-dsn.php" rel="external">http://pear.php.net/manual/en/package.database.db.intro-dsn.php</a>
Abraço.
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 ??
Hélio disse:
Qual é a vantagem de sempre usar uma referência em toda atribuiçaõ?
Abraçus,
Hélio
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??
Ciro Feitosa 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!
Jackson CereB disse:
Como faço para instalar o DB em um servidor remoto? Posso apenas incluir a classe?
Ciro Feitosa disse:
Jackson,
Basta você copiar a classe (incluindo o PEAR) para o teu servidor, e fazer chamada dela no seu arquivo PHP.
Abraço!
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
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
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
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.
Ciro Feitosa 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
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!!
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+
Ciro Feitosa 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.
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
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.
Max disse:
blza?
Ciro, Quais as implicações legais sobre o uso deste pacote em softwares que serao licenciados (proprietarios) ou vendidos.?
muito obrigado!
Max
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.
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 .
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?)
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
Milena disse:
Ciro, estou com o seguinte erro:
Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation \\\\
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 ???
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...)
Davi Ribeiro disse:
Seguinte:
Minha experiência é com .Net e Java. Não sei nada de PHP.
Só que, no momento, estou precisando dar manutenção em um site - em Wordpress (php) - e preciso fazer um select.
Daí vou precisar usar o PEAR-DB. Perguntas:
1 - Baixei o arquivo de instalação e o descompactei, sendo criada a pasta DB-1.7.14RC1. Copio isso para onde? Como instalo esse bagulho?
Agradeço desde já.