palestra de pdo

57
PDO PHP Data Objects

Upload: almir-m3nd3s

Post on 18-Jan-2015

2.083 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Palestra de PDO

PDOPHP Data Objects

Page 2: Palestra de PDO
Page 3: Palestra de PDO
Page 4: Palestra de PDO

Porque?Porque?

Como?Como?

O que?O que?

Page 5: Palestra de PDO
Page 6: Palestra de PDO

PDO

DB Driver

DB

Page 7: Palestra de PDO

abstração de abstração de bancobanco

NÃO ÉNÃO É

Page 8: Palestra de PDO

ACESSO A ACESSO A DADOSDADOS

Page 9: Palestra de PDO

Por que?Por que?

Page 10: Palestra de PDO

PadronizaçãoPadronização

Page 11: Palestra de PDO

mysql_connect('host','usuario','senha');

pg_connect('host=host port=5432 dbname=bd user=usuario password=senha');

Page 12: Palestra de PDO

Mas eu sempre fiz assim!Tá errado?

Page 13: Palestra de PDO

ÓÓ!ÓÓ!

Page 14: Palestra de PDO

Suporte a TransaçãoSuporte a Transação

Page 15: Palestra de PDO

Proteção a SQL InjectionProteção a SQL Injection

Page 16: Palestra de PDO

Handle de ArquivosHandle de Arquivos

Page 17: Palestra de PDO

MySQLMySQLFirebird/InterbaseFirebird/Interbase

IBMIBM

InformixInformix

FreeTDSFreeTDS

OracleOracle

ODBC e DB2ODBC e DB2

PostgreSQLPostgreSQL

SQLiteSQLite

MS SQL ServerMS SQL Server

Page 18: Palestra de PDO

Unificar

Page 19: Palestra de PDO

Transparência

Page 20: Palestra de PDO

Como?Como?

Page 21: Palestra de PDO

$dsn = 'mysql:host=host;port=3306;dbname=bd';$usuario = 'usuario';$senha = 'senha';$opcoes = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_CASE => PDO::CASE_LOWER);

try { $pdo = new PDO($dsn, $usuario, $senha, $opcoes);} catch (PDOException $e) { echo 'Erro: '.$e->getMessage();}

DSN: String de conexãoDSN: String de conexão

1

Opções de conexãoOpções de conexão2

Executando a conexãoExecutando a conexão3

Page 22: Palestra de PDO
Page 23: Palestra de PDO

try { $pdo = new PDO($dsn, $usuario, $senha, $opcoes);} catch (PDOException $e) { echo 'Erro: '.$e->getMessage();}

Page 24: Palestra de PDO

É muito feio!

Page 25: Palestra de PDO

Como laçar consultas?Como laçar consultas?

Page 26: Palestra de PDO

$db->exec()$db->exec()

$db->query()$db->query()

Page 27: Palestra de PDO

$n = $pdo->exec(“INSERT INTO inteiros (numero) VALUES (1)”);

$id = $pdo->lastInsertId();

echo "Inseridos ”, $n, “ registro(s).\n";

Page 28: Palestra de PDO

Número de registrosNúmero de registrosafetados, ZERO ou FALSE afetados, ZERO ou FALSE

Page 29: Palestra de PDO

Sem resultset!

Page 30: Palestra de PDO

Não é o ideal para execuçãoRepetitiva de SQL

Page 31: Palestra de PDO

$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"; }

Page 32: Palestra de PDO

Em Array

Page 33: Palestra de PDO

FETCH_NUMBER

Page 34: Palestra de PDO

FETCH_NAMED / FETCH_ASSOC

Page 35: Palestra de PDO

FETCH_BOTH

Page 36: Palestra de PDO

FETCH_OBJ

Page 37: Palestra de PDO

setAttribute

Construtor

Page 38: Palestra de PDO

Ainda não é bom para execuçãorepetitiva de SQL

Page 39: Palestra de PDO
Page 40: Palestra de PDO

prepare

bind

execute

Page 41: Palestra de PDO
Page 42: Palestra de PDO

PlaceholdersPlaceholders

Page 43: Palestra de PDO

Isso não vaiprestar :(

No DOIS agentecorre!

Page 44: Palestra de PDO

bindParam()

Page 45: Palestra de PDO

$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();

Page 46: Palestra de PDO

$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();

Page 47: Palestra de PDO

$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();

Page 48: Palestra de PDO

Transações

Page 49: Palestra de PDO

Suporte a Transação

Page 50: Palestra de PDO

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();}

Page 51: Palestra de PDO

Arquivos

Page 52: Palestra de PDO

$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();

Page 53: Palestra de PDO

$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);

Page 54: Palestra de PDO

É fistaile!

Page 55: Palestra de PDO

O que faço com isso?O que faço com isso?

Page 56: Palestra de PDO

ORMsFrameworks

Usar!

Active record

Você tem twitter?

Page 57: Palestra de PDO

@m3nd3s

http://www.almirmendes.net/

[email protected]