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
Extension MySQL Extension mysqli Version d'introduction en PHP Inclus en PHP 5.x Statut de dveloppement MySQL Recommande pour les nouveaux projets MySQL L'API supporte les jeux de caractres L'API supporte les commandes prpares L'API supporte les commandes prpares ct client L'API supporte les procdures stockes L'API supporte les commandes multiples L'API supporte toutes les fonctionnalits MySQL 4.1 et plus rcent Avant 3.0 Oui, mais dsactiv Maintenance uniquement Non Non Non Non Non Non Non 5.0 Oui Dveloppement actif Oui Oui Oui Non Oui Oui Oui PDO (avec le pilote PDO MySQL Driver et MySQL Native Driver) 5.0 Oui Dveloppement actif depuis PHP 5.3 Oui Oui Oui Oui Oui La plupart La plupart

2/13

Qu'est ce que PDO


PDO signie 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-nouveautesde-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 PDO_CUBRID PDO_DBLIB PDO_FIREBIRD PDO_IBM PDO_INFORMIX PDO_MYSQL PDO_OCI PDO_ODBC PDO_PGSQL PDO_SQLITE PDO_4D Bases de donnes supportes Cubrid FreeTDS / Microsoft SQL Server / Sybase Firebird/Interbase 6 IBM DB2 IBM Informix Dynamic Server MySQL 3.x/4.x/5.x Oracle Call Interface ODBC v3 (IBM DB2, unixODBC et win32 ODBC) PostgreSQL SQLite 3 et SQLite 2 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 : Vrie si nous sommes dans une transaction lastInsertId : Retourne l'identiant 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 : Congure 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 spcique 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 : Dnie un attribut de requte setFetchMode : Dnit 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 chier 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 nal 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