Comment utiliser l'objet PDO de PHP pour les connexions à une base de données?

Aujourd’hui, je vais vous parler de ce qui va bientôt être la seule façon d’inititier une « discussion » entre un script PHP et une base de donnée, en effet la version 6 de PHP ne supportera plus des fonction comme mysql_select_db() , mysql_query() et autres fonctions du même genre permettant l’interation avec une base de donnée jusqu’à la version 5.x de PHP.

Qu’est-ce que c’est un objet PDO?

PDO pour PHP Data Objects, pour faire simple donc, les discussions avec notre base de données se feront avec la notion d’Objet, pour ceux qui ne voient pas ce qu’est la programmation orientée objet, direction Wikipedia.

Qu’est-ce que ça change?

Tout! Avec PDO, on ne s’embête plus à faire un gros script qui gère le fait que l’on utilise une base de donnée MySQL, SQL Server, PostgreSQL, Oracle, etc… Ici, nous n’avons besoins de changer que quelques parametres, et zou! on utilise les même methodes partout dans notre projet PHP. PDO permet donc une meilleure portabilité d’un programme sur un autre environemment que celui pour lequel il a été développé.

Comment utiliser PDO ?

Mieux qu’une explication à rallonge, on va voir ici un exemple de connexion simple à une base MySQL sans utiliser PDO, et ensuite en utilisant PDO, pour bien mettre en evidence l’avantage d’utiliser PDO pour nos prochains projets.

Imaginons qu’on est une base de données nommée « dbtest », contenant la table « tbltest » construite de la façon suivante :

CREATE TABLE tbltest (
id int NOT NULL auto_increment,
login varchar(50),
pass varchar(255),
email varchar(200),
PRIMARY KEY(id)
);

En utilisant les fonctions mysql_* il nous faut écrire pas mal de code pour se connecter à la base et executer une requête :

<?php
$db = mysql_connect('localhost','login','password'); //connexion à  MySQL
mysql_select_db('dbtest',$db); //séléction de la base sur laquelle on va travailler
$strSQL = "SELECT login,pass,email FROM tbltest"; //notre requête
$result = mysql_query($strSQL) or die('Erreur '.mysql_error()); //execution de la requête
//affichage des résultats
while($row = mysql_fetch_assoc($result)){
echo $row['login']." ".$row['pass']." ".$row['email']."<br/>";
}
mysql_close();
?>

Maintenant, voyons comment executer cette même requête avec un objet PDO :

<?php
try {//creation de l'objet PDO
$db = new PDO('mysql:host=localhost;dbname=dbtest','login','password');
$strSQL = "SELECT login,pass,email FROM tbltest";
//execution de la requête et affichage des résultats
foreach($db->query($strSQL) as $row){
echo $row['login']." ".$row['pass']." ".$row['email']."<br/>";
}
} catch (PDOException $e){ //erreur de connexion à la basse
print "Erreur : ".$e->getMessage()
die();
}
$db = null; //on ferme la connexion
?>

L’avantage de PDO : les requêtes préparées

Bien que l’exemple plus haut soit un exemple basique, PDO permet d’exécuter des requêtes préparées et c’est tout l’interet de la chose. En effet, les requêtes préparées permettent un gain de temps puisque nous utilisons une espèce de « patron » pour construire notre requête, et lors de l’exécution de celle-ci, on passe un tableau de paramètres. Ainsi on peut executer la même requête plusieurs fois avec différents paramètres très facilement et rapidement.

Executer une requête préparée

Pour construire et executer une requête préparée nous aurons besoin de la fonction prepare() de l’objet PDO, cette fonction retournera un objet PDOStatment, qui nous permettra d’executer la requête en lui passant les paramètres avec la fonction execute().

Il est a noter que l’on peut préparer une requête de plusieurs manières : grâce à des marqueurs (?) ou des paramètres nommées (:nom_parametre)

<?php
//création de la requête avec la methode des marqueurs
$strSQL = "SELECT login,pass,email FROM tbltest WHERE login = ? AND pass = ? ";
//requête construite avec les paramètres nommés
//$strSQL = "SELECT login,pass,email FROM tbltest WHERE login = :login AND pass = :pwd ";

$stmt = $db->prepare($strSQL); // création de l'objet PDOStatment
$stmt->execute(array('mon_login','mon_password'));
//execution avec la methode des paramètres nommés
//$stmt->execute(array(':login' => 'mon_login', ':pwd' => 'mon_password'));

//affichage du résultat
while($row = $stmt->fetch(PDO::FETCH_OBJ)){
echo $row->login." ".$row->pass." ".$row->email."<br/>";
}
?>

Pour plus d’infos sur l’objet PDO rendez vous sur le site du manuel PHP