Back-End

16 mar, 2010

Desenvolvendo com PDO PHP Data Objects

Publicidade

Veremos hoje os benefícios de desenvolver com PDO, mas primeiro
vamos entender um pouco sobre ele e como tudo funciona.

Em razão da crescente utilização do PHP, surgiu a necessidade de
unificar o acesso a diferentes bancos de dados presentes no PHP e assim
surgiu o PDO PHP Data Objects, no qual o objetivo é definir uma interface
limpa e consistente, unificando a maioria das características presentes
nas extensões de acesso a banco de dados.

A PDO fornece uma camada de abstração de dados de acesso, significa
que, independente de qual banco de dados esteja usando, você usa as
mesmas funções para manipular os dados, além de ser extremamente segura
contra SQL Injection. A classe PDO foi incorporada ao PHP na versão 5.1 e
é disponibilizado junto com a PECL do PHP 5, além disso, exige
características orientadas a objetos do core do PHP 5, ou seja, não
espere que o PDO funcione em versões anteriores.

Para podermos utilizar o PDO, deve-se habilitar no php.ini
os drivers de acesso para o banco de dados de nossa aplicação, no linux
habilitamos da seguinte forma:

extension=pdo.so
extension=pdo_mysql.so
extension=pdo_pgsql.so
extension=pdo_sqlite.so

E no windows:

extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

Obviamente que você irá habilitar somente os drivers que deseja
utilizar, consulte a lista completa de drivers aqui: PDO
Drivers

Se você usa uma revenda ou um servidor alugado e não tem acesso ao php.ini, verifique os drivers habilitados assim:

<?php
foreach(PDO::getAvailableDrivers() as $driver)
{
echo $driver.'<br />';
}
?>

Exemplos

Vou colocar dois exemplos de como usar PDO. Primeiro caso,
inserção de dados. O programa vai se conectar com o banco chamado leomoreira
no servidor localhost, em seguida vai os inserir dados na
tabela veiculos e depois fechar a conexão. Caso ocorra
algum erro será gerada uma exceção devidamente tratada com o bloco try/catch

<?php
try
{
//instancia o objeto PDO, conectando com o banco mysql
$conn = new PDO('mysql:host=localhost;port=3306;dbname=leomoreira', 'root', '123456');

//executa as instruções SQL
$conn->exec("INSERT INTO veiculos (codigo, fabricante, modelo) VALUES (1, 'Honda', 'Civic')");
$conn->exec("INSERT INTO veiculos (codigo, fabricante, modelo) VALUES (2, 'Honda', 'City')");
$conn->exec("INSERT INTO veiculos (codigo, fabricante, modelo) VALUES (3, 'Honda', 'Fit')");
$conn->exec("INSERT INTO veiculos (codigo, fabricante, modelo) VALUES (4, 'Honda', 'Accord')");

//fecha a conexão
$conn = null;
}
catch (PDOException $i)
{
//se houver exceção, exibe
print "Erro: <code>" . $i->getMessage() . "</code>";
}
?>

Fácil, não? Segundo caso, listagem de dados. O programa vai se conectar ao
banco conforme o exemplo anterior, em seguida vai listar os dados tabela
veiculos e exibir o fabricante e modelo, veja como os
resultados são percorridos com foreach.

<?php
try
{
//instancia o objeto PDO, conectando com o banco mysql
$conn = new PDO('mysql:host=localhost;port=3306;dbname=leomoreira', 'root', '123456');

//executa a instrução de consulta
$result = $conn->query("SELECT fabricante, modelo FROM veiculos");

if($result)
{
//percorre os resultados via o laço foreach
foreach($result as $linha){
//exibe o resultado
print $linha['fabricante'] . " - " . $linha['modelo'] . "<br>\n";
}

}
//fecha a conexão
$conn = null;
}
catch (PDOException $i)
{
//se houver exceção, exibe
print "Erro: <code>" . $i->getMessage() . "</code>";
}
?>

Resultado:

Honda - Civic
Honda - City
Honda - Fit
Honda - Accord

Podemos também retornar os dados usando a função fecth(),
assim:

<?php
try
{
//instancia o objeto PDO, conectando com o banco mysql
$conn = new PDO('mysql:host=localhost;port=3306;dbname=leomoreira', 'root', '123456');

//executa a instrução de consulta
$result = $conn->query("SELECT fabricante, modelo FROM veiculos");

if($result)
{
//percorre os resultados via o fetch()
while ($linha = $result->fetch(PDO::FETCH_OBJ))
{
//exibe resultado
print $linha->fabricante . " - " . $linha->modelo . "<br>\n";
}

}

//fecha a conexão
$conn = null;
}
catch (PDOException $i)
{
//se houver exceção, exibe
print "Erro: <code>" . $i->getMessage() . "</code>";
}
?>

PDO na prática

Bom, pessoal, eu queria mostrar um exemplo mais complexo de como usar o
PDO com orientação a objetos, dentro de uma classe para gerenciar
conexões com vários bancos, mas o artigo já está muito grande, então vou deixar esse exemplo para o próximo artigo. Até lá!