Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,042
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
61
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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