PDO é uma extensão do PHP que permite ao programador acessar diferentes bancos de dados através de uma única interface. Isso significa que mesmo que em sua aplicação você tenha que lidar com mais de um banco de dados, como MySQL/SQL Server, poderá fazer consultas e disparar comandos utilizando as mesmas classes e métodos. Além disso, com o PDO você terá acesso a código de alto nível, construído sobre o paradigma orientado a objetos.

Para criar uma conexão com um banco de dados utilizando o PDO, você precisa instanciar um objeto do tipo PDO, utilizando para isso a classe PDO. Em seu construtor, essa classe recebe três parâmetros. O primeiro deles é o DSN que contém informações sobre como se conectar com o banco de dados.

[nome-do-motor-de-banco-de-dados]:host=caminho-para-o-banco-de-dados;dbname=nome-do-banco-de-dados

Logo após, no segundo parâmetro do construtor, informamos o usuário para conexão e em seguida a senha desse usuário. No código a seguir apresentamos um exemplo da criação de um objeto PDO.

$pdo =
new PDO('mysql:host=localhost:8090;dbname=devmedia', 'root', '1234');

É importante observar que o DSN de conexão pode sofrer alterações, dependendo do banco de dados. Apesar do PDO facilitar o acesso por meio de uma interface única, alguns detalhes como conexão e o dialeto SQL utilizado estão sujeitos ao banco de dados escolhido pelo desenvolvedor. Portanto, ao encontrar algum erro aqui, verifique se o DSN de conexão está de acordo com o esperado pelo banco de dados em produção.

Composição do DNS no MySQL Composição do DNS no SQL Server Composição do DNS no PostgreSQL Composição do DNS no Firebird Composição do DNS no Oracle
#PraCegoVer - Transcrição dos Slides
  • No MySQL o DSN é composto pelo local e nome do banco de dados - mysql:host=localhost:3306;dbname=testdb
  • No SQL Server o DNS é composto pelo servidor e nome do banco de dados - sqlsrv:Server=localhost;DataBase=testdb
  • O PostgreSQL agrega no DNS o local, porta, nome, usuário e senha do banco de dados - pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass
  • Já o Firebird utiliza o caminho para o arquivo físico do banco de dados no DSN - firebird:dbname=localhost:/var/lib/firebird/2.5/data/employee.fdb
  • E essa é a forma como o Oracle estrutura o seu DSN, separando o local e nome do banco de dados com barras - oci:dbname=//localhost:1521/mydb

A fim de facilitar o desenvolvimento, recomendamos a utilização do atributo PDO::ATTR_ERRMODE com o valor PDO::ERRMODE_EXCEPTION para que os erros disparados pela extensão sejam reportados como exceções. Assim não precisaremos verificar o retorno de cada método, prática que geralmente leva a proliferação de if/else encadeados, dificultando sua leitura. O suporte a esse atributo depende da versão do PHP que você está executando.

Além desse atributo, também podemos utilizar PDO::MYSQL_ATTR_INIT_COMMAND com o valor SET NAMES 'utf8', caso você esteja trabalhando com tabelas nessa codificação. Isso permitirá ao PDO reconhecer caracteres especiais, como letras acentuadas e cedilhas, evitando erros de codificação. Este trecho de código mostra como realizar essas configurações:

  
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

Para disparar uma consulta utilizamos o método PDO::query, que recebe como parâmetro um comando SQL e retorna um objeto do tipo PDOStatement. É através desse objeto que podemos ler os registros retornados, armazenando-os em um array associativo, cujas chaves correspondem as colunas listadas no SELECT. Faremos isso da seguinte forma:

  
 $pdoStatement = $pdo->query("SELECT id, nome, preco FROM produto LIMIT 5");
 
 while($row = $pdoStatement->fetch(PDO::FETCH_ASSOC)){
 
           echo "<p>{$row['id']} {$row['nome']} {$row['preco']}</p>";
 }

No while, declaramos que enquanto o método PDOStatement retornar um registro, desejamos armazená-lo na variável $row. Logo abaixo na próxima instrução, utilizamos os nomes de cada coluna para acessar os valores do registro atual e imprimí-los para o usuário. Note que os dados só são retornados em forma de array associativo porque utilizamos o fetch_style PDO::FETCH_ASSOC, para o método fetch, que também pode retornar objetos a depender do fetch_style utilizado.

Caso o PDO não consiga se conectar com o banco de dados um erro fatal será emitido. Nessa mensagem estarão contidas a localização do script executado e a linha na qual o problema se originou. Caso isso ocorra, verifique se o banco de dados está em execução, se o nome do usuário/senha estão corretos ou se o host informado corresponde ao IP do computador no qual o banco de dados está em execução.

Fatal error: in E:\xampp\htdocs\conpdo\conpdo.php on line 3

Outro erro comum é omitir a porta através da qual o banco de dados será acessado, caso a padrão não seja a utilizada. Quando esse é o caso, no DSN de conexão devemos informar o host e a porta de conexão, conforme apresentado a seguir:

mysql:host=localhost:8090;dbname=devmedia

Confira também