Vous êtes sur la page 1sur 13

PDO : PHP Data Object

1/13
Tous ne sont que des extensions...
Les fonstions mysql_* : API mysql
Les fonctions mysqli_* aussi
Il en est de mme pour PDO
PDO (avec le pilote PDO MySQL Driver et
Extension MySQL Extension mysqli
MySQL Native Driver)
Version d'introduction en PHP Avant 3.0 5.0 5.0
Inclus en PHP 5.x Oui, mais dsactiv Oui Oui
Maintenance Dveloppement
Statut de dveloppement MySQL Dveloppement actif depuis PHP 5.3
uniquement actif
Recommande pour les nouveaux projets
Non Oui Oui
MySQL
L'API supporte les jeux de caractres Non Oui Oui
L'API supporte les commandes prpares Non Oui Oui
L'API supporte les commandes prpares
Non Non Oui
ct client
L'API supporte les procdures stockes Non Oui Oui
L'API supporte les commandes multiples Non Oui La plupart
L'API supporte toutes les fonctionnalits
Non Oui La plupart
MySQL 4.1 et plus rcent

2/13
Qu'est ce que PDO
PDO signifie Php Data Object
C' est une couche d'abstraction des fonctions d'accs aux bases de
donnes
Les requtes ne seront pas automatiquement compatibles avec
n'importe quelle base de donnes
Seules les fonctions d'accs sont universelles :
pour mysql:
mysql_connect()
mysql_query()
mysql_result()
mysql_fetch_array()
mysql_real_escape_string()
etc.

3/13
Pourquoi PDO plutt qu'un autre ?
D'autres alternatives existent : MDB2 de PEAR
PDO : extension compile de PHP donc performances suprieures
Standard : http://www.phpteam.net/index.php/articles/les-nouveautes-
de-php-6
Depuis la version 5 de php, MySQL est dsactiv

4/13
PDO : Encore en dveloppement
Certains pilotes de PDO sont encore en dveloppement
D'autres n'existent pas encore
Liste des pilotes disponibles :
Nom du driver Bases de donnes supportes
PDO_CUBRID Cubrid
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_IBM IBM DB2
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x/5.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC et win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 et SQLite 2
PDO_4D 4D

5/13
La classe PDO
commit : Valide une transaction
__construct : Cre une instance PDO qui reprsente une connexion la base
errorCode : Retourne le SQLSTATE associ avec la dernire opration sur la base de donnes
errorInfo : Retourne les informations associes l'erreur lors de la dernire opration sur la base de
donnes
exec : Excute une requte SQL et retourne le nombre de lignes affectes
getAttribute : Rcupre un attribut d'une connexion une base de donnes
PDO::getAvailableDrivers : Retourne la liste des pilotes PDO disponibles
inTransaction : Vrifie si nous sommes dans une transaction
lastInsertId : Retourne l'identifiant de la dernire ligne insre ou la valeur d'une squence
prepare : Prpare une requte l'excution et retourne un objet
query : Excute une requte SQL, retourne un jeu de rsultats en tant qu'objet PDOStatement
quote : Protge une chane pour l'utiliser dans une requte SQL PDO
rollBack : Annule une transaction (mme si le script php plante)
setAttribute : Configure un attribut PDO
beginTransaction : Dmarre une transaction

6/13
Exemple d'instanciation
fichier my_setting.ini:
[database]
driver = mysql
host = localhost
;port = 3306
schema = db_schema
username = user
password = secret

Classe PHP:

<?php

class MyPDO extends PDO {

public function __construct($file = 'my_setting.ini') {


if (!$settings = parse_ini_file($file, TRUE))
throw new exception('Impossible d'ouvrir ' . $file . '.');

$dns = $settings['database']['driver'] .
':host=' . $settings['database']['host'] .
((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) :
'') .
';dbname=' . $settings['database']['schema'];

parent::__construct($dns, $settings['database']['username'], $settings['database']['password']);


}

}
?>

7/13
La classe PDOStatement
bindColumn : Lie une colonne une variable PHP
bindParam : Lie un paramtre un nom de variable spcifique
bindValue : Associe une valeur un paramtre
closeCursor : Ferme le curseur, permettant la requte d'tre de nouveau excute
columnCount : Retourne le nombre de colonnes dans le jeu de rsultats
debugDumpParams : Dtaille une commande prpare SQL
errorCode : Rcupre le SQLSTATE associ lors de la dernire opration sur la requte
errorInfo : Rcupre les informations sur l'erreur associe lors de la dernire opration sur la requte
execute : Excute une requte prpare
fetch : Rcupre la ligne suivante d'un jeu de rsultat PDO
fetchAll : Retourne un tableau contenant toutes les lignes du jeu d'enregistrements
fetchColumn : Retourne une colonne depuis la ligne suivante d'un jeu de rsultats
fetchObject : Rcupre la prochaine ligne et la retourne en tant qu'objet
getAttribute : Rcupre un attribut de requte
getColumnMeta : Retourne les mtadonnes pour une colonne d'un jeu de rsultats
nextRowset : Avance la prochaine ligne de rsultats d'un gestionnaire de lignes de rsultats
multiples
rowCount : Retourne le nombre de lignes affectes par le dernier appel la fonction
PDOStatement::execute()
setAttribute : Dfinie un attribut de requte
setFetchMode : Dfinit le mode de rcupration par dfaut pour cette requte
8/13
Fetch styles
PDO::FETCH_BOTH par dfaut
PDO::FETCH_ASSOC: retourne un tableau index par le nom de la colonne comme retourn dans le
jeu de rsultats
PDO::FETCH_BOTH (dfaut): retourne un tableau index par les noms de colonnes et aussi par les
numros de colonnes, commenant l'index 0, comme retourns dans le jeu de rsultats
PDO::FETCH_BOUND: retourne TRUE et assigne les valeurs des colonnes de votre jeu de rsultats
dans les variables PHP laquelle elles sont lies avec la mthode PDOStatement::bindParam()
PDO::FETCH_CLASS: retourne une nouvelle instance de la classe demande, liant les colonnes du
jeu de rsultats aux noms des proprits de la classe. Si fetch_style inclut PDO::FETCH_CLASS
(c'est--dire PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE), alors le nom de la classe est
dtermin partir d'une valeur de la premire colonne
PDO::FETCH_INTO: met jour une instance existante de la classe demande, liant les colonnes du
jeu de rsultats aux noms des proprits de la classe
PDO::FETCH_LAZY: combine PDO::FETCH_BOTH et PDO::FETCH_OBJ, crant ainsi les noms
des variables de l'objet, comme elles sont accdes
PDO::FETCH_NUM: retourne un tableau index par le numro de la colonne comme elle est retourn
dans votre jeu de rsultat, commenant 0
PDO::FETCH_OBJ: retourne un objet anonyme avec les noms de proprits qui correspondent aux
noms des colonnes retourns dans le jeu de rsultats

9/13
La classe PDOException
PDOException::getMessage Rcupre le message de l'exception
PDOException::getPrevious : Retourne l'exception prcdente
PDOException::getCode : Rcupre le code de l'exception
PDOException::getFile : Rcupre le fichier dans lequel l'exception est
survenue
PDOException::getLine : Rcupre la ligne dans laquelle l'exception
est survenue
PDOException::getTrace : Rcupre la trace de la pile
PDOException::getTraceAsString : Rcupre la trace de la pile en tant
que chane
PDOException::__toString : Reprsente l'exception sous la forme
d'une chane
PDOException::__clone : Clone l'exception

10/13
Transactions avec PDO
<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
array(PDO::ATTR_PERSISTENT => true));
echo "Connect\n";
} catch (Exception $e) {
die("Impossible de se connecter: " . $e->getMessage());
}

try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

11/13
Requtes prpares
Pourquoi les requtes prpares ?

Inconvnients:
plus de lignes de code que pour une requte simple
excution unique : performances moindres par rapport une
excution directe
rsultat final identique : excuter une requte
dbogage de la requte lgrement plus complexe

Avantages:
impose une certaine rigueur de programmation
optimisation du temps d'excutions requis pour les requtes
excutes plus d'une fois
plus grande scurit au niveau des requtes
sparation requte SQL des donnes

12/13
Requtes prpares : exemple
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>
<legend>Recherche de client</legend>
<label>Ville </label><input type="text" name="ville" /><br /><br />
<label>Id_client</label><input type="text" name="id_client" /><br />
<input type="submit" value="Envoyer" />
</fieldset>
</form>

<?php
if (isset($_POST[ville]) && isset($_POST[id_client])) {
$ville = strtolower($_POST[ville]);
$id_client = $_POST[id_client];
include(connexpdo.inc.php);
$idcom = connexpdo('magasin', 'myparam');
//$reqprep = $idcom>prepare("SELECT prenom,nom FROM client WHERE lower(ville)=:ville AND id_client>=:id_client");
$reqprep = $idcom>prepare("SELECT prenom,nom FROM client WHERE lower(ville)=:ville AND id_client>=:id_client");
//*****Liaison des paramtres

$reqprep>bindParam(':ville',$ville,PDO::PARAM_STR);
$reqprep>bindParam(':id_client',$id_client,PDO::PARAM_INT);
$reqprep>bindParam(3,$id_client,PDO::PARAM_INT);
$reqprep>execute();

//*****Liaison des rsultats des variables


$reqprep>bindColumn('prenom', $prenom);
$reqprep>bindColumn('nom', $nom);

//*****Affichage
echo "<div><h3>Il y a ", $reqprep>rowCount(), " client(s) habitant ", ucfirst($ville), " et dont l'identifiant est
suprieur $id_client</h3><hr />";
while ($result = $reqprep>fetch(PDO::FETCH_BOUND)) {
echo "<h3> $prenom $nom</h3>";
}
echo "</div>";
$reqprep>closeCursor();
$idcom = null;
}
?>

13/13

Vous aimerez peut-être aussi