Bonjour à tous,
Ayant commencé depuis quelques mois ma transition de mysql_* à PDO, je viens vous proposer un petit retour, sous forme de tutoriel, à ce sujet. Le but sera de bien comprendre PDO, ses avantages et son mode d'emploi, puis de proposer quelques codes pour l'utiliser.
Note : je n'aborderais pas ici les outils utilisant PDO comme Zend_Db ou Symfony, cela déborderait du cadre de cet article.
I/ PDO, pourquoi ?
Tout d'abord, la question qui vient à l'esprit lors du passage vers PDO, c'est : pourquoi faire ? Après tout, ça marchait très bien avant ! Et bien, il y a plusieurs raisons à cette transition.
La première raison est purement pratique : lors de l'arrivée de PHP 6, d'ici quelques temps tout de même, les fonctions mysql_* et mysqli_* seront dépreciées et passées en module de PEAR ; par conséquent, petit à petit, les hébergeurs cesseront le support de ces fonctions. Bien sûr, il y a du temps, mais autant prendre directement les bonnes habitudes, non ?
La seconde raison est liée à la sécurité : l'utilisation de PDO et des requêtes préparées permet, nous le verront, de supprimer les risques d'injections SQL dans vos scripts.
La troisième raison est l'interopérabilité : en utilisant PDO, vous pouvez facilement changer de SGBD, alors qu'avec les fonctions mysql_*, c'est tout votre code que vous deviez reprendre.
Il y a d'autres raisons, mais ce sont les plus importantes à mes yeux.
II/ PDO, les bases
PDO est séparée en trois classes différentes, et toutes aussi utiles les unes que les autres : PDO, PDOStatement, PDOException.
PDO est la classe de base : c'est elle qui gère les requêtes et les relations à la base au sens propre.
PDOStatement est la classe qui gère à la fois la préparation des requêtes et leurs retours ; c'est la classe de résultats, en quelques sortes.
PDOException est, comme son nom l'indique, la classe d'exception de PDO. Je ne m'étendrais pas là-dessus, le système d'Exception est complexe.
III/ Les DSN et la connexion
Commençons par le commencement : la connexion à une base de données. Pour se connecter, PDO utilise ce que l'on appelle un DSN (Data Source Name). Pour faire simple, c'est une chaine de caractères qui contient la description de la base sur laquelle on souhaite se connecter.
Un DSN ressemble à ceci :
Examinons les parties importantes. Le "mysql" en début de chaine indique que l'on se connecte à un serveur mysql. Actuellement, PDO supporte MySQL, MS SQL Serveur, Firebird, Interbase, IBM, Informix, Oracle, ODBC, DB2, PostgreSQL, SQLite et 4D (attention, certains de ces supports sont expérimentaux).
Le dbname= indique le nom de la base de données où nous allons nous connecter (ici "mabase"). C'est l'équivalent de l'ancienne fonction "mysql_select_db" ou de la commande SQL USE
Le host= indique le nom du serveur sur lequel nous allons nous connecter ; ici 127.0.0.1, donc en local.
Ce DSN doit être passé à PDO, ainsi que deux autres arguments : le nom d'utilisateur et le mot de passe. Tout ceci dans le constructeur ; la création d'une connexion avec PDO ressemble donc à ça :
Ayant commencé depuis quelques mois ma transition de mysql_* à PDO, je viens vous proposer un petit retour, sous forme de tutoriel, à ce sujet. Le but sera de bien comprendre PDO, ses avantages et son mode d'emploi, puis de proposer quelques codes pour l'utiliser.
Note : je n'aborderais pas ici les outils utilisant PDO comme Zend_Db ou Symfony, cela déborderait du cadre de cet article.
I/ PDO, pourquoi ?
Tout d'abord, la question qui vient à l'esprit lors du passage vers PDO, c'est : pourquoi faire ? Après tout, ça marchait très bien avant ! Et bien, il y a plusieurs raisons à cette transition.
La première raison est purement pratique : lors de l'arrivée de PHP 6, d'ici quelques temps tout de même, les fonctions mysql_* et mysqli_* seront dépreciées et passées en module de PEAR ; par conséquent, petit à petit, les hébergeurs cesseront le support de ces fonctions. Bien sûr, il y a du temps, mais autant prendre directement les bonnes habitudes, non ?
La seconde raison est liée à la sécurité : l'utilisation de PDO et des requêtes préparées permet, nous le verront, de supprimer les risques d'injections SQL dans vos scripts.
La troisième raison est l'interopérabilité : en utilisant PDO, vous pouvez facilement changer de SGBD, alors qu'avec les fonctions mysql_*, c'est tout votre code que vous deviez reprendre.
Il y a d'autres raisons, mais ce sont les plus importantes à mes yeux.
II/ PDO, les bases
PDO est séparée en trois classes différentes, et toutes aussi utiles les unes que les autres : PDO, PDOStatement, PDOException.
PDO est la classe de base : c'est elle qui gère les requêtes et les relations à la base au sens propre.
PDOStatement est la classe qui gère à la fois la préparation des requêtes et leurs retours ; c'est la classe de résultats, en quelques sortes.
PDOException est, comme son nom l'indique, la classe d'exception de PDO. Je ne m'étendrais pas là-dessus, le système d'Exception est complexe.
III/ Les DSN et la connexion
Commençons par le commencement : la connexion à une base de données. Pour se connecter, PDO utilise ce que l'on appelle un DSN (Data Source Name). Pour faire simple, c'est une chaine de caractères qui contient la description de la base sur laquelle on souhaite se connecter.
Un DSN ressemble à ceci :
Code :
mysql:dbname=mabase;host=127.0.0.1
Examinons les parties importantes. Le "mysql" en début de chaine indique que l'on se connecte à un serveur mysql. Actuellement, PDO supporte MySQL, MS SQL Serveur, Firebird, Interbase, IBM, Informix, Oracle, ODBC, DB2, PostgreSQL, SQLite et 4D (attention, certains de ces supports sont expérimentaux).
Le dbname= indique le nom de la base de données où nous allons nous connecter (ici "mabase"). C'est l'équivalent de l'ancienne fonction "mysql_select_db" ou de la commande SQL USE
Le host= indique le nom du serveur sur lequel nous allons nous connecter ; ici 127.0.0.1, donc en local.
Ce DSN doit être passé à PDO, ainsi que deux autres arguments : le nom d'utilisateur et le mot de passe. Tout ceci dans le constructeur ; la création d'une connexion avec PDO ressemble donc à ça :
Code PHP :
<?php
$pdo = new PDO('mysql:dbname=mabase;host=127.0.0.1', 'root', 'password');
Simple, non ? Il est maintenant important de gérer les exceptions, cela se fait comme ceci :
Code PHP :
<?php
try {
$pdo = new PDO('mysql:dbname=mabase;host=127.0.0.1', 'root', 'password');
} catch (PDOException $e) {
echo 'Erreur de connexion : ' . $e->getMessage();
}