Upload
almir-m3nd3s
View
2.083
Download
1
Embed Size (px)
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?