You are on page 1of 11

Introduction

La programmation dapplication Web oblige aujourdhui bien plus quavant penser selon la philosophie du modle MVC (Modle vue contrleur). Pour que les applications soient portables et faciles maintenir il devient quasiment indispensable de sparer nettement les couches prsentation, traitement et accs des donnes. PHP nest pas en reste et propose ds la version 5 de nombreux paquetages et interfaces permettant de satisfaire aux nouvelles exigences de dveloppement avec notamment PDO (PHP Data Objects).

1 - Prsentation de PDO
1.1 - Quest-ce que PDO ?
PHP 5.1 a inclut en standard une interface dabstraction pour laccs aux bases de donnes : la bibliothque PDO (PHP Data Objects). Contrairement aux interfaces dabstractions comme ADODB ou PEAR DB, cette couche logicielle intgre PHP, permet daccder directement et de faon uniforme de nombreux moteurs de bases de donnes tel que MySQL, SQLite, PostgreSQL, Oracle. Ainsi dans lhypothse dune ventuelle migration vers une autre base de donnes, il suffira simplement de modifier le fichier de configuration de lapplication pour que cette dernire sadapte automatiquement et cela sans avoir toucher au code proprement dit. PDO permet donc denvoyer et rcuprer le rsultat de requtes SQL de manire totalement transparente. Toutefois il nest pas possible dexcuter les fonctions de base de donnes en utilisant lextension PDO seule. Il faut imprativement utiliser un driver PDO spcifique la base de donnes.

1.2 - Comment obtenir PDO ?


PDO est disponible dans PECL ( PHP Extension Code Library ) la bibliothque dextension de PHP ladresse suivante : http://pecl.php.net/

1.3 - Les drivers PDO


Les drivers PDO disponibles sont :

1.4 - Installation
Pour installer et activer les drivers PDO de votre choix suivez les instructions selon votre systme dexploitation.

-> Windows :
1. Tlchargez la bibliothque dll php_pdo.dll sur : http://snaps.php.net/win32/PECL_5_0/ 2. Ajoutez lextension PDO dans votre php.ini extension=php_pdo.dll 3. Choisissez les dll spcifiques votre base de donnes : extension=php_pdo_firebird.dll extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll 4. Placez les dans le rpertoire indiqu dans extension_dir du php.ini. 5. Redmarrez le serveur web.

-> Linux :
1. Tlchargez le paquetage PDO : bash$ wget http://pecl.php.net/get/PDO 2. Placez le binaire dans le rpertoire bin de votre PHP. Si le binaire PHP 5 PECL se situe dans le dossier /usr/local/php5/bin/php alors le dossier des binaires sera /usr/local/php5/bin. 3. Crez le PATH du rpertoire bin de php : Export PATH= /usr/local/php5/bin :$PATH 4. Compilez et installez lextension PDO : bash$ tar xzf PDO-0.9.tgz bash$ cd PDO-0.9 bash$ phpize bash$ ./configure bash$ make bash$ sudo -s bash# make install bash# echo extension=pdo.so >> /usr/local/php5/lib/php.ini

2 - Utilisation de PDO
2.1 - Connexion
Pour commencer il faut construire un objet PDO. Cest lui qui va permettre de se connecter la base de donnes. Selon la base de donnes le constructeur de la classe PDO peut comprendre au minimum un argument et au maximum quatre.
PDO::_construct(string dsn [, username [, string password [, array driver_options]]])

Largument qui est au minimum requis est le DSN (Data Source Name). Il dfinit la source de donnes utiliser et comprend le nom du serveur de base de donnes et le nom de la base de donnes. Il nest pas possible de spcifier un port.

-> Pour Mysql :


$dsn = "mysql:host=localhost;dbname=mybdd";

-> Pour SQLite :


$dsn = sqlite:/home/databases/mybdd.sq3 ; Les autres paramtres du constructeur sont dans lordre : le nom dutilisateur, le mot de passe et un tableau de paramtres spcifique chaque moteur de base de donnes. La connexion ou cration dune instance seffectue ainsi : $bdd = new PDO($dsn, $username, $password); Le constructeur de lobjet PDO lance une exception du type PDOException dans le cas ou la connexion ne peut stablir. Pour lintercepter : try{ $bdd = new PDO($dsn, $login, $pass); } catch(PDOException $e){ die(Connexion impossible :.$e-> getMessage()) ; }

2.2 - Excution d'une requte

La fonction PDO::exec() : excute une requte et retourne le nombre denregistrements affects. On lutilise surtout dans le cas des requtes de type INSERT et UPDATE.

$nbrow = $bdd->exec(INSERT INTO actor_table (name, surname) values (ALBA, Jessica), (CRUISE,Tom), (PITT,Brad), (HOLMES,Katie)); La fonction PDO::query() : excute une requte et retourne un jeu de rsultats sous la forme dun objet de type PDOStatement. $result = $bdd->query(SELECT name, surname FROM actor_table);

2.3 - Rcupration des rsultats


Lobjet de type PDOStatement permet daccder aux rsultats dune requte.

PDOStatement::fetch() : rcupre ligne aprs ligne le jeu de rsultats. Par dfaut une ligne est retourne sous la forme dun tableau associatif et index.

While(false !==($line = $result->fetch()) { print_r $line;

PDOStatement::fetchAll(): rcupre un tableau contenant toutes les lignes du jeu de rsultats.

$resultset = $result->fetchAll() ; print_r $resultset ; PDOStatement::fetchColumn(int column_number) : retourne la valeur dune colonne de lenregistrement. $name = $result->fetchColumn(0) ; Print($name) ; // ALBA $name = $result->fetchColumn(0) ; Print($name) ; // CRUISE En passant directement le format de sortie dsir en paramtre ou en utilisant la fonction PDOStatement::setFetchMode() qui va changer le format de sortie de manire globale, il est possible de changer le format de sortie de PDOStatement::fetchAll() et PDOStatement::fetch(). Voici une liste des formats de sortie : - PDO_FETCH_ASSOC permet de rcuprer un tableau associatif de type : array(nomChamp => valeur, ...) - PDO_FETCH_NUM permet de rcuprer un tableau index de type : array(0 => valeurChamp1, ...) - PDO_FETCH_BOTH permet de rcuprer un tableau qui est la fois associatif et index - PDO_FETCH_OBJ permet de rcuprer un objet gnrique dont le nom des proprits correspondent aux noms des colonnes du jeu de rsultats - PDO_FETCH_LAZY permet de rcuprer un objet de type PDORow dont le nom des proprits correspondent aux noms des colonnes du jeu de rsultats

2.4 - Prparation des requtes


La bibliothque PDO permet galement de lier les paramtres et les rsultats d'une requte avec des variables PHP. Il faut utiliser PDOStatement::bindParam() : /* Cette requte permet de rcuprer un acteur par son nom. :actorname est une variable nomme qu'on pourra modifier chaque excution de la requte.*/ $sql = "SELECT name, surname FROM actor_table WHERE name = :actorname";

$table_name = array('ALBA','HOLMES'); // Prparation de la requte $req = $bdd->prepare($sql); // On lie la variable $name au paramtre :actorname $req->bindParam(': actorname ', $name, PDO_PARAM_STR); foreach($table_name as $name) { // Excution de la requte pour rcuprer le nom courant : $req->execute(); // Rcupration des rsultats print($req->fetchColumn(1)); } // AFFICHE : // Jessica // Katie La fonction PDO::bindParam() permet de grer plus simplement les passages de paramtres grce deux arguments supplmentaires spcifiant le type et la taille du paramtre. De mme, la fonction PDO::bindColumn() facilite la rcupration des rsultats qui se fait directement dans des variables au lieu dutiliser un tableau ou un objet gnrique aprs l'appel des fonctions de rcupration du jeu de rsultats. $sql = "SELECT name, surname FROM actor_table"; $name = NULL; // Prparation de la requte $req = $bdd->prepare($sql); // Excution de la requtes pour rcuprer les noms : $req->execute(); // On lie le rsultat de la colonne 'name' la variable PHP $name $req->bindColumn('name',$name); while(false !== $req->fetch()) { print($name.' - '); } //AFFICHE : // ALBA CRUISE PITT HOLMES -

2.5 - Les transactions


Les transactions sont utiles la prservation de lintgrit des donnes lorsquune ou plusieurs tables sont modifies successivement par des requtes dpendant les unes des autres. Pour grer les transactions, PDO utilise trois fonctions : - PDO::beginTransaction() va dmarrer la transaction $bdd->beginTransaction(); // On lance la transaction $del = $bdd->exec("DELETE FROM actor_table WHERE id = 1"); $ins = $bdd->exec("INSERT INTO actor_table (name,surname) VALUES ('WILLIS','Bruce')"); - PDO::commit() va valider la transaction $bdd->commit(); - PDO::rollBack() va annuler la transaction if(false == $del || false == $ins) $bdd->rollBack();

2.6 - Dtection des erreurs

PDO::errorCode() et PDOStatement::errorCode()

Les fonctions PDO::errorCode() et PDOStatement::errorCode() retournent le SQLSTATE* associ avec la dernire opration sur la base de donnes cest dire quelles retournent les codes erreurs des oprations excutes directement sur le gestionnaire de base de donnes.
* Le SQLSTATE est en fait un identifiant alphanumrique de cinq caractres dfini dans le standard ANSI SQL

// Provoque une erreur - la table actor n'existe pas $bdd->exec("INSERT INTO actor (name, surname) VALUES ('LIU', Lucy)"); echo "\nPDO::errorCode(): "; print $bdd->errorCode() ; //AFFICHE : // PDO::errorCode(): 42S02

PDO::errorInfo() et PDOStatement::errorInfo()

Les fonction PDO::errorInfo() et PDOStatement::errorInfo() retournent sous forme de tableau les informations associes lerreur gnre lors de la dernire opration sur la base de donnes. Le tableau contient les champs suivants :

//Provoque une erreur - la table actor n'existe pas $err = $bdd->prepare('SELECT name, surname FROM actor'); $err->execute(); echo "\nPDO::errorInfo():\n"; print_r($err->errorInfo()); /* AFFICHE : PDO::errorInfo(): Array ( [0] => 42S02 [1] => -204 [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "FILM.ACTOR" is an undefined name. SQLSTATE=42704 )*/

3 - Index des classes PDO


3.1 - La classe PDO
La classe PDO dfinie une connexion entre PHP et le serveur de base de donnes Les mthodes de la classe PDO sont les suivantes : beginTransaction - cre une transaction commit - valide une transaction exec - excute une requte SQL et retourne le nombre de lignes errorCode - rcupre les codes erreurs depuis la base de donnes errorInfo - rcupre un tableau contenant les informations sur l'erreur getAttribute - rcupre un attribut d'une connexion une base de donnes lastInsertId - rcupre la valeur de la dernire ligne insre dans une table

prepare - prpare une requte SQL pour excution query - excute une requte SQL et retourne le jeu de rsultats quote - retourne une version avec guillemet simple d'une chane pour utilisation dans une requte SQL rollBack - annule une transaction setAttribute - dfinit un attribut d'une connexion une base de donnes

3.2 - La classe PDOStatement


La classe PDOStatement cre des requtes prpares et rcupre le jeu de rsultats associ. Les mthodes de la classe PDOStatement sont les suivantes : bindColumn - associe une variable PHP une colonne de sortie dans un jeu de rsultats bindParam - associe une variable PHP un paramtre dans une requte prpare closeCursor - ferme le curseur, ce qui permet la requte dtre excute une nouvelle fois columnCount - retourne le nombre de colonnes dans un jeu de rsultats errorCode - rcupre le code erreur depuis une requte errorInfo - rcupre un tableau contenant les informations sur une erreur depuis une requte execute - excute une requte prpare fetch - rcupre une ligne depuis un jeu de rsultats fetchAll - rcupre un tableau contenant toutes les lignes depuis un jeu de rsultats fetchColumn - retourne les donnes depuis une colonne d'un jeu de rsultats getAttribute - rcupre un attribut PDOStatement getColumnMeta - rcupre les mta-informations pour une colonne d'un jeu de rsultats nextRowset - rcupre la ligne suivante du jeu de rsultats rowCount - retourne le nombre de lignes affectes par l'excution d'une requte SQL setAttribute - dfinit un attribut PDOStatement setFetchMode - dfinit le mode de rcupration pour une PDOStatement La classe PDOStatement comprend galement des constantes prdfinies. Toutefois ces dernires ne sont disponibles que si cette extension est charge au moment de l'excution ou alors a t compile avec PHP. Les constantes prdfinies relatives aux types de donnes : PDO_PARAM_NULL(entier) PDO_PARAM_INT (entier) PDO_PARAM_STR (entier) PDO_PARAM_LOB (entier)

PDO_PARAM_STMT (entier) PDO_PARAM_INPUT_OUTPUT (entier) Les constantes prdfinies relatives aux mthodes de rcupration des jeux de rsultats : PDO_FETCH_LAZY (entier) PDO_FETCH_ASSOC (entier) PDO_FETCH_NUM (entier) PDO_FETCH_BOTH (entier) PDO_FETCH_OBJ (entier) PDO_FETCH_BOUND (entier) PDO_FETCH_COLUMN (entier) PDO_FETCH_CLASS (entier) PDO_FETCH_INTO (entier) PDO_FETCH_FUNC (entier) PDO_FETCH_GROUP (entier) PDO_FETCH_UNIQUE (entier) PDO_FETCH_CLASSTYPE (entier) PDO_FETCH_ORI_NEXT (entier) PDO_FETCH_ORI_PRIOR (entier) PDO_FETCH_ORI_FIRST (entier) PDO_FETCH_ORI_LAST (entier) PDO_FETCH_ORI_ABS (entier) PDO_FETCH_ORI_REL (entier) Les constantes prdfinies permettant de configurer les transactions : PDO_ATTR_AUTOCOMMIT (entier) PDO_ATTR_PREFETCH (entier) PDO_ATTR_TIMEOUT (entier) PDO_ATTR_ERRMODE (entier) PDO_ATTR_SERVER_VERSION (entier) PDO_ATTR_CLIENT_VERSION (entier) PDO_ATTR_SERVER_INFO (entier) PDO_ATTR_CONNECTION_STATUS (entier) PDO_ATTR_CASE (entier) PDO_ATTR_CURSOR_NAME (entier) PDO_ATTR_CURSOR (entier) PDO_ATTR_DRIVER_NAME (chane de caractres) PDO_ATTR_ORACLE_NULLS (entier) PDO_ATTR_PERSISTENT (entier) PDO_ATTR_FETCH_CATALOG_NAMES (entier) PDO_ATTR_FETCH_TABLE_NAMES (entier) Les constantes prdfinies relatives la gestion des erreurs :

PDO_ERRMODE_SILENT (entier) PDO_ERRMODE_WARNING (entier) PDO_ERRMODE_EXCEPTION (entier) PDO_ERR_CANT_MAP (entier) PDO_ERR_SYNTAX (entier) PDO_ERR_CONSTRAINT (entier) PDO_ERR_NOT_FOUND (entier) PDO_ERR_ALREADY_EXISTS (entier) PDO_ERR_NOT_IMPLEMENTED (entier) PDO_ERR_MISMATCH (entier) PDO_ERR_TRUNCATED (entier) PDO_ERR_DISCONNECTED (entier) PDO_ERR_NO_PERM (entier) PDO_ERR_NONE (chane de caractres) Les constantes prdfinies dterminant le format du nom des colonnes du jeu de rsultat : PDO_CASE_NATURAL (entier) PDO_CASE_LOWER (entier) PDO_CASE_UPPER (entier) Les constantes prdfinies configurant les curseurs sur les jeux de rsultats : PDO_CURSOR_FWDONLY (entier) PDO_CURSOR_SCROLL (entier)