Palestra de PDO

Preview:

DESCRIPTION

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

Citation preview

PDOPHP Data Objects

Porque?Porque?

Como?Como?

O que?O que?

PDO

DB Driver

DB

abstração de abstração de bancobanco

NÃO ÉNÃO É

ACESSO A ACESSO A DADOSDADOS

Por que?Por que?

PadronizaçãoPadronizaçã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çãoSuporte a Transação

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

Handle de ArquivosHandle de Arquivos

MySQLMySQLFirebird/InterbaseFirebird/Interbase

IBMIBM

InformixInformix

FreeTDSFreeTDS

OracleOracle

ODBC e DB2ODBC e DB2

PostgreSQLPostgreSQL

SQLiteSQLite

MS SQL ServerMS SQL Server

Unificar

Transparência

Como?Como?

$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

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

É muito feio!

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

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

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

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

$id = $pdo->lastInsertId();

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

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

Sem resultset!

Não é o ideal para execuçãoRepetitiva 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çãorepetitiva de SQL

prepare

bind

execute

PlaceholdersPlaceholders

Isso não vaiprestar :(

No DOIS agentecorre!

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?O que faço com isso?

ORMsFrameworks

Usar!

Active record

Você tem twitter?

@m3nd3s

http://www.almirmendes.net/

m3nd3s@gmail.com