Quinta-feira, 05 de Janeiro, 2006 | 34 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.
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
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!
Parabéns Ciro,
Excelente artigo, já adicionei no meu del.icio.us como referência.
Abraços.
Olá, ciro, parabéns pelo excelente artigo.
kra, tentei executar aqui e deu seguinte erro:
Error DB: extension not found.
o que poderia ser?
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!
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á?
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!
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"]
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
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.
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 ??
Qual é a vantagem de sempre usar uma referência em toda atribuiçaõ?
Abraçus,
Hélio
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??
@ 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!
Como faço para instalar o DB em um servidor remoto? Posso apenas incluir a classe?
Jackson,
Basta você copiar a classe (incluindo o PEAR) para o teu servidor, e fazer chamada dela no seu arquivo PHP.
Abraço!
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
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
$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
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.
@ 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 ![]()
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!!
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+
@ 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.
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
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.
blza?
Ciro, Quais as implicações legais sobre o uso deste pacote em softwares que serao licenciados (proprietarios) ou vendidos.?
muito obrigado!
Max
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.
site de vcs muito bom , sera q vcs poderia me ajudar ESTOU PRECISANDO DE FAZER UMA ENQUETE SEM PRECISAR DE BANCO DE DADOS .
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?)
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
Ciro, estou com o seguinte erro:
Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation \\\\
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 ???
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...)
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.
English Version © Copyright 2004-2008 Ciro Feitosa - Todos os Direitos Reservados