Professional Documents
Culture Documents
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.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.
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);
PDOStatement::fetch() : rcupre ligne aprs ligne le jeu de rsultats. Par dfaut une ligne est retourne sous la forme dun tableau associatif et index.
$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
$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 -
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 )*/
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
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)