Extensão PDO
Autor: Eduardo Vieira | Publicado: 2016-07-10T17:18:00-07:00


Olha galera do PHP! 

Hoje vamos falar de PDO que é muito usado no php desde a versão 5.1.0.

A PDO é uma biblioteca para abstração de conexões a bancos de dados — embutida no PHP desde a versão 5.1.0
— que fornece uma interface comum para conversar com vários bancos de dados diferentes. Por exemplo, você pode
usar basicamente o mesmo código para fazer a interface com o MySQL ou SQLite:

&lt;?php
// PDO + MySQL
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo-&gt;query("SELECT some\_field FROM some\_table");
$row = $statement-&gt;fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);

// PDO + SQLite
$pdo = new PDO('sqlite:/path/db/foo.sqlite');
$statement = $pdo-&gt;query("SELECT some\_field FROM some\_table");
$row = $statement-&gt;fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);

A PDO não irá traduzir
suas consultas SQL ou emular funcionalidades que não existem; ela é feita puramente para conectar múltiplos tipos de
bancos de dados com a mesma API.


Mais importante, a PDO permite que você injete de forma segura entradas externas (e.g IDs) em suas consultas SQL
sem se preocupar com ataques de SQL injection.
Isso é possível usando instruções PDO (PDO statements) e parâmetros restritos (bound parameters).


Vamos assumir que um script PHP recebe um ID numérico como parâmetro de uma consulta. Este ID deve ser usado para
buscar um registro de um usuário no banco de dados. Essa é a forma errada de fazer isso:

&lt;?php
$pdo = new PDO('sqlite:/path/db/users.db');
$pdo-&gt;query("SELECT name FROM users WHERE id = " . $_GET['id']); // &lt;-- NÃO!
&nbsp;
&nbsp;Esse código é péssimo. Você está inserindo um parâmetro bruto na sua consulta SQL. Isso fará você ser hackeado num
piscar de olhos, usando uma prática chamada SQL Injection. Apenas imagine se um
hacker passar como parâmetro um id inventivo chamando uma URL como http://domain.com/?id=1%3BDELETE+FROM+users. 
Isso irá definir a variável $_GET['id'] como id=1;DELETE FROM users, o que irá excluir todos os seus usuários. Em
vez disso, você deveria higienizar (sanitize) a entrada do ID usando parâmetros restritos da PDO.

&lt;?php
$pdo = new PDO('sqlite:/path/db/users.db');
$stmt = $pdo-&gt;prepare('SELECT name FROM users WHERE id = :id');
$stmt-&gt;bindParam(':id', $_GET['id'], PDO::PARAM_INT); //&lt;-- Higienizado automaticamente pela PDO
$stmt-&gt;execute();

Esse é o código correto. Ele usa um parâmetro restrito em uma instrução PDO. Assim a entrada externa do ID é escapada
antes de ser introduzida no banco de dados, prevenindo contra potenciais ataques de SQL injection.



Leia mais sobre a PDO

Você também deve estar ciente de que usam recursos do servidor e não é raro ter esses recursos esgotados se essas
conexões não forem implicitamente fechadas, entretanto isso é mais comum em outras linguagens. Com PDO você pode
implicitamente fechar as conexões pela destruição dos objetos garantindo que todas as referências a ele forem excluídas,
ex. atribuindo NULL a elas. Se você não fizer isso explicitamente o PHP irá fechar todas as conexões quando seu script
terminar - a não ser é claro que você esteja usando conexões persistentes.

Bom e isso ai ate a próxima...