Documente Academic
Documente Profesional
Documente Cultură
THE PROBLEM
High maintenance
FEATURES
Performance
Native C code beats a scripted solution
Takes advantage of latest PHP 5 internals
Power
Gives you common DB features as a base
Still be able to access specialist functions
Easy
Non-intrusive
Clear
Runtime extensible
Drivers can be loaded at runtime
AVAILABLE DRIVERS
Oracle OCI
[PDO_OCI]
[PDO_ODBC]
MySQL 3.x
[PDO_MYSQL]
Postgres
[PDO_PGSQL]
SQLite 3.x
[PDO_SQLITE]
Firebird
[PDO_FIREBIRD]
Build PHP 5
--with-zlib --prefix=/usr/local/php5
cd PDO-*
PATH=/usr/local/php5/bin:$PATH
make install
cd PDO_XXX*
make install
http://snaps.php.net/win32/PECL_5_0/
You need:
php_pdo.dll
php_pdo_XXX.dll
SWITCHING IT ON
Unix:
extension=pdo.so
extension=pdo_XXX.so
Windows
extension=php_pdo.dll
extension=php_pdo_XXX.dll
Driver:optional_driver_specific_stuff
sqlite:/path/to/db/file
sqlite::memory:
mysql:host=name;dbname=dbname
pgsql:native_pgsql_connection_string
oci:dbname=dbname;charset=charset
firebird:dbname=dbname;charset=charset;role=role
odbc:odbc_dsn
DSN ALIASING
uri:uri
Specify location of a file containing actual DSN on the first line
Works with streams interface, so remote URLs can work too
name
(with no colon)
CONNECTION MANAGEMENT
try {
$dbh = new PDO($dsn, $user, $pw);
} catch (PDOException $e) {
echo connect failed: . $e->getMessage();
}
// use the database here
//
// done; release the connection
$dbh = null;
PERSISTENT PDO
$dbh = new PDO($dsn, $user, $pass,
array(
PDO_ATTR_PERSISTENT => true
)
);
PERSISTENT PDO 2
FETCH TYPES
$stmt->fetch(PDO_FETCH_BOTH)
Array with numeric and string keys
default option
PDO_FETCH_NUM
Array with numeric keys
PDO_FETCH_ASSOC
Array with string keys
PDO_FETCH_OBJ
$obj->name holds the name column from the row
PDO_FETCH_BOUND
Just returns true until there are no more rows
SMARTER QUERIES
Quoting is annoying, but essential
PDO offers a better way
$stmt->prepare(INSERT INTO CREDITS (extension, name)
VALUES (:extension, :name));
$stmt->execute(array(
:extension => xdebug,
:name => Derick Rethans
));
PORTABILITY AIDS
$dbh->setAttribute(
PDO_ATTR_ORACLE_NULLS, true);
Converts empty strings to NULL when fetched
PDO_ATTR_CASE
Some databases (notably, Oracle) insist on returning column names in uppercase
$dbh->setAttribute(PDO_ATTR_CASE, PDO_CASE_UPPER);
$stmt = $dbh->prepare(
"SELECT extension, name from CREDITS");
if ($stmt->execute()) {
$stmt->bindColumn(EXTENSION', $extension);
$stmt->bindColumn(NAME',
$name);
while ($stmt->fetch(PDO_FETCH_BOUND)) {
echo Extension: $extension\n;
echo Author: $name\n;
}
}
DATA TYPING
Very loose
ERROR HANDLING
$dbh->setAttribute(PDO_ATTR_ERRMODE, $mode);
PDO_ERRMODE_SILENT
PDO_ERRMODE_WARNING
PDO_ERRMODE_EXCEPTION
PDO_ERRMODE_SILENT
if (!$dbh->query($sql)) {
echo $dbh->errorCode() . "<br>";
$info = $dbh->errorInfo();
// $info[0] == $dbh->errorCode()
// unified error code
// $info[1] is the driver specific
// error code
// $info[2] is the driver specific
// error string
}
PDO_ERRMODE_EXCEPTION
try {
$dbh->exec($sql);
} catch (PDOException $e) {
// display warning message print
$e->getMessage();
$info = $e->errorInfo;
// $info[0] == $e->code;
//
TRANSACTIONS
try {
$dbh->beginTransaction();
$dbh->query(UPDATE );
$dbh->query(UPDATE );
$dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
}
Scrollable cursors
RESOURCES
http://www.oracle.com/technology/pub/articles/php_experts/otn_pdo_oracle5.ht
ml
Bugs?
http://pecl.php.net/bugs/report.php?package=PDO_XXX