PDO
PHP Data Objects
O que?
Porque?
Como?
PDO
  DB Driver
         DB
NÃO É
abstração de
   banco
ACESSO A
 DADOS
Por que?
Padronização
mysql_connect('host','usuario','senha');




pg_connect('host=host port=5432
dbname=bd user=usuario
password=senha');
Mas eu sempre
  fiz assim!
  Tá errado?
ÓÓ!
Suporte a Transação
Proteção a SQL Injection
Handle de Arquivos
MySQL
          Firebird/Interbase

IBM      MS SQL Server
                  ODBC e DB2
     FreeTDS
             PostgreSQL
Oracle
          Informix    SQLite
Unificar
Transparência
Como?
DSN: String de conexão

  1
$dsn = 'mysql:host=host;port=3306;dbname=bd';
$usuario = 'usuario';
$senha = 'senha';                 Opções de conexão
$opcoes = array(      2
   PDO::ATTR_PERSISTENT => true,
   PDO::ATTR_CASE => PDO::CASE_LOWER
);
                              Executando a conexão
try {                3
   $pdo = new PDO($dsn, $usuario, $senha, $opcoes);
} catch (PDOException $e) {
   echo 'Erro: '.$e->getMessage();
}
try {
   $pdo = new PDO($dsn, $usuario, $senha, $opcoes);
} catch (PDOException $e) {
   echo 'Erro: '.$e->getMessage();
}
É muito feio!
Como laçar consultas?
$db->exec()
$db->query()
$n = $pdo->exec(“INSERT INTO inteiros
(numero) VALUES (1)”);

$id = $pdo->lastInsertId();

echo "Inseridos ”, $n, “ registro(s).n";
Número de registros
afetados, ZERO ou FALSE
Sem resultset!
Não é o ideal para execução
    Repetitiva de SQL
$sql = 'SELECT nome, email FROM
participantes ORDER BY nome';

  foreach ($conn->query($sql) as $row) {
     print $row['nome'] . "t";
     print $row['cor'] . "t";
     print $row['calorias'] . "n";
  }
Em Array
FETCH_NUMBER
FETCH_NAMED / FETCH_ASSOC
FETCH_BOTH
FETCH_OBJ
setAttribute


Construtor
Ainda não é bom para execução
      repetitiva de SQL
prepare

     bind

          execute
Placeholders
Isso não vai
                  prestar :(
No DOIS agente
    corre!
bindParam()
$sql = 'SELECT nome, email, twitter
        FROM participantes
        WHERE idade > :idade AND estado = :estado';

$stmt = $conn->prepare($sql);

$stmt->bindParam(':idade', 18, PDO::PARAM_INT));
$stmt->bindParam(':estado', 'ES', PDO::PARAM_STR,
2));

$stmt->execute();
$rows_es = $stmt->fetchAll();
$sql = 'SELECT nome, email, twitter
        FROM participantes
        WHERE idade > :idade AND estado = :estado';

$stmt = $conn->prepare($sql, array(PDO::ATTR_CURSOR
=> PDO::CURSOR_FWDONLY));

$stmt->execute(array(':idade' => 18, ':estado' =>
'ES'));
$rows_es = $stmt->fetchAll();

$stmt->execute(array('idade' => 25, 'estado' =>
'RJ'));
$rows_rj = $stmt->fetchAll();
$sql = 'SELECT nome, email, twitter
        FROM participantes
        WHERE idade > ? AND estado = ?';

$stmt = $conn->prepare($sql,
array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

$stmt->execute(array(18, 'ES'));
$rows_es = $stmt->fetchAll();

$stmt->execute(array(25, 'RJ'));
$rows_rj = $stmt->fetchAll();
Transações
Suporte a Transação
try {

    [ … ]

  $dbh->beginTransaction();
  $dbh->exec("insert into staff (id, first, last) values (23,
'Joe', 'Bloggs')");
  $dbh->exec("insert into salarychange (id, amount,
changedate)
      values (23, 50000, NOW())");
  $dbh->commit();

} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}
Arquivos
$stmt = db->prepare("insert into images (id,
contenttype, imagedata) values (?, ?)");

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$stmt->bindParam(1, $_FILES['file']['type']);
$stmt->bindParam(2, $fp, PDO::PARAM_LOB);

$stmt->execute();
$stmt = $db->prepare("select contenttype, imagedata
from images where id=?");

$stmt->execute(array(5));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);

header("Content-Type: $type");
fpassthru($lob);
É fistaile!
O que faço com isso?
ORMs
        Frameworks


Usar!            Você tem twitter?




        Active record
@m3nd3s
m3nd3s@gmail.com
http://www.almirmendes.net/

Palestra de PDO