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
             PostgreS...
Unificar
Transparência
Como?
DSN: String de conexão

  1
$dsn = 'mysql:host=host;port=3306;dbname=bd';
$usuario = 'usuario';
$senha = 'senha';         ...
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, “ regist...
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['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 ...
$sql = 'SELECT nome, email, twitter
        FROM participantes
        WHERE idade > :idade AND estado = :estado';

$stmt ...
$sql = 'SELECT nome, email, twitter
        FROM participantes
        WHERE idade > ? AND estado = ?';

$stmt = $conn->pr...
Transações
Suporte a Transação
try {

    [ … ]

  $dbh->beginTransaction();
  $dbh->exec("insert into staff (id, first, last) values (23,
'Joe', 'Bloggs...
Arquivos
$stmt = db->prepare("insert into images (id,
contenttype, imagedata) values (?, ?)");

$fp = fopen($_FILES['file']['tmp_na...
$stmt = $db->prepare("select contenttype, imagedata
from images where id=?");

$stmt->execute(array(5));
$stmt->bindColumn...
É 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
Palestra de PDO
Palestra de PDO
Palestra de PDO
Palestra de PDO
Palestra de PDO
Upcoming SlideShare
Loading in …5
×

Palestra de PDO

2,255 views

Published on

Palestra ministrada no II Workshop PHP-ES sobre a camada de abstração de acesso a banco de dados PDO (PHP Data Object)

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,255
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
65
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Palestra de PDO

  1. 1. PDO PHP Data Objects
  2. 2. O que? Porque? Como?
  3. 3. PDO DB Driver DB
  4. 4. NÃO É abstração de banco
  5. 5. ACESSO A DADOS
  6. 6. Por que?
  7. 7. Padronização
  8. 8. mysql_connect('host','usuario','senha'); pg_connect('host=host port=5432 dbname=bd user=usuario password=senha');
  9. 9. Mas eu sempre fiz assim! Tá errado?
  10. 10. ÓÓ!
  11. 11. Suporte a Transação
  12. 12. Proteção a SQL Injection
  13. 13. Handle de Arquivos
  14. 14. MySQL Firebird/Interbase IBM MS SQL Server ODBC e DB2 FreeTDS PostgreSQL Oracle Informix SQLite
  15. 15. Unificar
  16. 16. Transparência
  17. 17. Como?
  18. 18. 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(); }
  19. 19. try { $pdo = new PDO($dsn, $usuario, $senha, $opcoes); } catch (PDOException $e) { echo 'Erro: '.$e->getMessage(); }
  20. 20. É muito feio!
  21. 21. Como laçar consultas?
  22. 22. $db->exec() $db->query()
  23. 23. $n = $pdo->exec(“INSERT INTO inteiros (numero) VALUES (1)”); $id = $pdo->lastInsertId(); echo "Inseridos ”, $n, “ registro(s).n";
  24. 24. Número de registros afetados, ZERO ou FALSE
  25. 25. Sem resultset!
  26. 26. Não é o ideal para execução Repetitiva de SQL
  27. 27. $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"; }
  28. 28. Em Array
  29. 29. FETCH_NUMBER
  30. 30. FETCH_NAMED / FETCH_ASSOC
  31. 31. FETCH_BOTH
  32. 32. FETCH_OBJ
  33. 33. setAttribute Construtor
  34. 34. Ainda não é bom para execução repetitiva de SQL
  35. 35. prepare bind execute
  36. 36. Placeholders
  37. 37. Isso não vai prestar :( No DOIS agente corre!
  38. 38. bindParam()
  39. 39. $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();
  40. 40. $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();
  41. 41. $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();
  42. 42. Transações
  43. 43. Suporte a Transação
  44. 44. 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(); }
  45. 45. Arquivos
  46. 46. $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();
  47. 47. $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);
  48. 48. É fistaile!
  49. 49. O que faço com isso?
  50. 50. ORMs Frameworks Usar! Você tem twitter? Active record
  51. 51. @m3nd3s m3nd3s@gmail.com http://www.almirmendes.net/

×