Traiter les exceptions PDO
Noter ce cours :
PDO est une couche d'abstraction permettant d'accéder à de nombreuses bases de données depuis PHP. Elle remplace les antédiluviennes fonctions mysql_(), pgsql_() etc. Utiliser PDO offre de meilleures performances et fonctionnalités. De plus, c'est la seule méthode valable qui sera intégrée nativement dans les futures versions de PHP.
Ces exceptions sont bien souvent mal rédigées, et il est difficile de s'y retrouver, c'est pourquoi j'ai essayé de lister l'ensemble des erreurs que vous pourrez trouver avec PDO ici. Elles commencent toutes par PDOException.
Installer PDO
Dans les versions supérieures ou égales à la 5.3 de PHP, PDO est intégré nativement. Vous n'aurez plus besoin de faire ces fastidieuses manipulations.
Sous Linux
Sous Linux, prenons le cas de Debian, vous devrez exécuter les commandes suivantes : apt-get install pdo.
~# apt-get install pdo
Ouvrez ensuite le fichier php.ini (situé généralement dans le répertoire /etc/php5/apache2/php.ini) puis ajoutez la ligne extension=pdo.so. CTRL+X et ensuite appuyez sur la touche Y (ou O en français) pour sauvegarder.
~# nano /etc/php5/apache2/php.ini
Pour installer ensuite les différents drivers PDO, vous pourrez utiliser la commande suivante (Exemple pour MySQL) : apt-get install pdo_mysql.
~# apt-get install pdo_mysql
Relancez ensuite Apache : /etc/init.d/apache2 restart.
~# /etc/init.d/apache2 restart
Sous Windows
Avec un utilitaire tel que WAMP, PDO est déjà inclus dans les dernières versions de PHP. Vous n'avez plus qu'à activer le ou les drivers dont vous avez besoin (voir plus bas). Si vous ne disposez pas d'un tel utilitaire, vous devrez décommenter dans le php.ini la ligne ;extension=php_pdo.dll.
Could not find driver
Cette erreur se produit lorsque vous tentez de vous connecter à une base dont le type est encore inconnu par PDO. Cela signifie que le driver nécessaire n'est pas installé, et que PDO ne peut donc pas contrôler ce type de base.
Pour résoudre ce problème, vous devez installer puis activer les extensions manquantes dans le fichier php.ini :
- L'extension php_pdo_mysql pour contrôler les bases de données MySQL
- L'extension php_pdo_pgsql pour contrôler les bases de données PostgreSQL
- L'extension php_pdo_mssql pour contrôler les bases de données SQL Server
- L'extension php_pdo_sqlite pour contrôler les bases de données SQLite
Sous Windows, repérez les différentes lignes ;extension=php_pdo_X.dll et enlevez le point-virgule se trouvant devant pour les décommenter, et relancez votre serveur Apache.
Sous Linux, repérez les différentes lignes extension=pdo_X.so et enlevez le point-
SQLSTATE[HY000] [1045] Access denied for user ...
Cette erreur survient lorsque le login ou/et le mot de passe utilisés pour vous connecter au serveur sont faux. Exemple de code utilisé pour se connecter à une base MySQL nommée test, sur le serveur localhost, avec PDO :
<?php
$db = new PDO('mysql:host=localhost;dbname=test', 'login', 'passe');
?>
Dans le cas où l'utilisateur login n'existe pas, ou alors si son mot de passe est différent de passe, le code ci-dessus ne fonctionnera pas et renverra une Exception PDOException.
Pour corriger cette erreur, vous devez indiquer un hôte, un login et un mot de passe valides.
SQLSTATE[HY000] [1049] Unknown database ...
Cette erreur survient lorsque la base de données à laquelle vous tentez de vous connecter n'existe pas. Prenons l'exemple suivant où je tente de me connecter à une base MySQL avec PDO. Cette base mabasequinexistepas n'existe pas (comme son nom l'indique).
<?php
$db = new PDO('mysql:host=localhost;dbname=mabasequinexistepas', 'root', '');
?>
L'erreur renvoyée sous forme d'exception par PDO sera la suivante :