PDO : Une autre façon d’accéder à vos bases de données
Introduction
Qu’est-ce que PDO ?
PDO (PHP Data Objects) est une extension PHP qui définit une interface d’accès à une base de données. Il a en quelque-sorte le même rôle que les fonctions mysql_connect, mysql_query, …
Il est inclus dans PHP depuis sa version 5.1. Pour la version 5.0, vous pouvez l’obtenir avec l’extension PECL.
Qu’a-t-il de plus que les fonctions mysql_… ?
Son principal avantage est qu’il permet une abstraction pour l’accès aux données. C’est-à-dire que les fonctions pour exécuter des requêtes et pour récupérer des données sont les mêmes, quelque-soit le serveur SQL utilisé (MySQL, PostgreSQL, …). Par exemple, si vous passez de MySQL à PostegreSQL, vous n’avez pas besoin de transformer tout votre code comme avec les fonctions mysql_ (mysql_connect serait remplacé par pgsql_connect, mysql_query par pgsql_query, …).
Mais comme chaque serveur SQL n’exécute pas les requêtes SQL de la même façon, il est possible que vous ayez à réécrire certaines requêtes.
PDO est aussi orienté objet, vous pouvez donc l’étendre et gérer les erreurs avec les exceptions.
Se connecter à votre serveur SQL
C’est la partie la plus simple. Observez ce code :
<?php $pdo = new PDO('mysql:host=localhost;dbname=votre_base', 'utilisateur', 'mot_de_passe'); ?>
J’ai souligné ce que vous pouvez modifier.
- « mysql » est le nom du driver utilisé. Si vous utilisez PostegreSQL, ça sera pgsql. Pour les autres, rendez-vous ici.
- « localhost » est l’hôte SQL. C’est le premier argument que vous donnez dans la fonction mysql_connect
- « votre_base » : c’est le nom de votre base de données. C’est ce que vous mettez dans mysql_select_db.
- « utilisateur » : le nom d’utilisateur
- « mot_de_passe » : votre mot de passe
Exécuter une requête sans retour
Qu’est-ce que j’appelle une requête sans retour ? C’est une requête qui ne retourne pas de données. Par exemple, les requêtes qui suppriment, modifient ou insèrent des données. Les requêtes qui retournent des données sont celles qui commencent par « SELECT … ».
Pour ce type de requête, il est préférable d’utiliser la méthode exec(), qui retourne le nombre de ligne affectées.
Regardez cet exemple :
<?php require 'sqlconnect.php'; $sql = 'DELETE FROM accouns WHERE type = "member"'; $prepare = $pdo->prepare($sql); $res = $prepare ->exec($sql); $nb = $prepare ->rowCount(); echo $nb.' membres ont été supprimés.'; ?>
Dans cet exemple, nous supprimons tous les comptes du type « membre » (on conserve donc les « admin » et les « modo »). Comme vous pouvez le voir, la variable $nb contient le nombre de lignes affectées (dans ce cas, supprimées) via notre requête.
Récupérer des données
Pour récupérer les données dans une base de données, nous allons utiliser la méthode query() de la classe PDO. Cette méthode retourne un objet du type « PDOStatement ».
La classe PDOStatement propose une méthode permettant de récupérer ligne par ligne les résultats : fetch().
Nous pouvons lui passer en argument la forme sous laquelle nous souhaitons récupérer les données : un tableau (par défaut), un objet, … Pour éviter de toujours indiquer sous quelle forme nous souhaitons récupérer les données à l’appel de la méthode fetch(), on peut l’indiquer une bonne fois pour toutes avec la méthode setFetchMode().
Afin de protéger nos requêtes contre les injections SQL, nous utiliserons la méthode quote() de la classe PDO. Elle se chargera d’ajouter les guillemets autour des chaines, et d’éviter les injections en doublant les guillemets à l’intérieur de la chaine.
Pour résumer tout ça, je vous propose de regarder cet exemple :
1. <?php 2. require 'sqlconnect.php'; 3. 4. $sql = 'SELECT * FROM membres'; 5. $req = $pdo->query($sql); 6. while($row = $req->fetch()) { 7. echo '<a href="membre-'.$row['id'].'.html">'.$row['pseudo'].'</a><br/>'; 8. } 9. $req->closeCursor(); 10.?>
Analysons ce script :
Ligne 2 : Nous incluons le script « sqlconnect.php » qui se charge de se connecter à MySQL comme nous l’avons déjà vu plus haut.
Ligne 4 : Nous stockons dans la variable $sql une requête SQL qui permet de récupérer tous les champs de toutes les entrées dans la table « membres ».
Ligne 5 : Nous exécutons la requête SQL et stockons le résultat (un objet PDOStatement) dans la variable $req
Ligne 6 : Nous effectuons une boucle pour chaque entrée. Comme je l’ai déjà dit, la méthode fetch() retoure les entrées (lignes) une par une. Lorsqu’il n’y en a plus, elle retourne false donc la boucle s’arrête. L’entrée est stockée dans la variable $row. Cette variable est un tableau qui contient une clé pour chaque champ, et aussi un numéro. Si « id » est le premier champ dans la table, alors nous pouvont le récupérer avec $row[0] et $row[‘id’]. Je préfère utiliser la seconde solution.
Ligne 7 : Ce n’est qu’un simple echo qui fait un lien vers la page de profil de chaque membre. Rien de bien compliquer. J’ai volontairement placer des espaces, sinon CommentÇaMarche.net transforme le HTML en un vrai lien.
Ligne 9 : Nous fermons le curseur car nous n’avons plus besoin de cette variable.
Pour protéger vos requêtes contre les injections SQL avec la méthode quote(), je vous propose de regarder cet exemple :
$sql = 'SELECT * FROM membres WHERE pseudo = '.$pdo->quote($pseudoMembre);