PHP Data Objects

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
image illustrant l’informatique
Cet article est une ébauche concernant l’informatique.

Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants.

PHP Data Objects (PDO) est une extension définissant l'interface pour accéder à une base de données depuis PHP.

Elle est orientée objet, la classe s’appelant PDO. PDO constitue une couche d'abstraction qui intervient entre l'application et le serveur de base de données. La couche d'abstraction permet de séparer le traitement de la base de données proprement dite. PDO facilite donc la migration d'une application vers un autre SGBD puisqu'il n'est plus nécessaire de changer le code déjà développé. Il faut seulement changer les arguments envoyés au constructeur.

Pour récupérer les enregistrements d’une table de la base de données, la méthode classique en PHP consiste à parcourir cette table ligne par ligne en procédant à des aller-retour entre le serveur d’application et le serveur de base de données. Ceci risque d’alourdir le traitement surtout si les deux serveurs sont installés chacun sur une machine différente. PDO remédie à ce problème en permettant de récupérer en une seule reprise tous les enregistrements de la table sous forme d’une variable PHP de type tableau à deux dimensions ce qui réduit visiblement le temps de traitement.

Compatibilité avec les versions de PHP[modifier | modifier le code]

PDO est fourni avec PHP 5.1. Elle est aussi disponible en tant qu'extension PECL pour PHP 5.0, mais ne fonctionne pas avec les versions antérieures de PHP car elle nécessite les fonctionnalités orientées objet de PHP 5. L'extension n'est pas activée avant PHP 5.1.0[1] par défaut, il faut donc décommenter la ligne php_pdo.dll dans php.ini. Pour activer le SGBD, il faut ensuite écrire : extension=php_pdo_[SGBD utilisé].dll.

Pilotes disponibles[modifier | modifier le code]

De nombreux pilotes sont disponibles pour PDO. On trouve la liste à jour sur le site php.net[2].

Classes[modifier | modifier le code]

PDO comporte trois classes :

  • la classe PDO, qui représente une connexion à la base de données ;
  • la classe PDOStatement, qui représente d'une part une requête SQL préparée et d'autre part le jeu de résultats de la requête une fois qu'elle est exécutée. Cette classe offre des méthodes de parcours et de comptage du jeu de résultats ;
  • la classe PDOException, qui représente une erreur émise par PDO.

Accès à la base de données[modifier | modifier le code]

L'accès à la base de données se fait en instanciant un objet de la classe PDO. Les paramètres à indiquer au constructeur sont :

  • la source de la base de données ;
  • optionnellement, le nom d'utilisateur et le mot de passe.

Par exemple, pour accéder à une base de données MySQL de nom ma_bd accessible sur le port mon_port du serveur mon_serveur avec l'utilisateur mon_id associé au mot de passe mon_mdp, le code sera le suivant :

$connexion = new PDO("mysql:host=mon_serveur;dbname=ma_bd;port=mon_port", "mon_id", "mon_mdp");

Passage de requêtes SQL[modifier | modifier le code]

Des méthodes de la classe PDO permettent de passer des requêtes SQL à l'objet récupéré lors de la connexion. La méthode PDO::exec(string $statement) de la classe PDO permet de passer et exécuter une requête SQL de type INSERT, UPDATE, DELETE. Elle retourne le nombre de lignes affectées par la requête.

$requete = "DELETE FROM ma_table WHERE mon_champ = ma_valeur";
$resultat = $connexion->exec($requete);
echo $resultat . " suppressions effectuées";

La méthode PDO::query(string $statement) de la classe PDO permet de passer et exécuter une requête SQL de type SELECT. Elle retourne le jeu de résultats (s'il y en a) sous forme d'objet PDOStatement.

$requete = "SELECT mon_champ FROM ma_table";
$resultat = $connexion->query($requete);

Passage de requêtes SQL préparées[modifier | modifier le code]

La méthode PDO::prepare() de la classe PDO permet de préparer une requête SQL pouvant contenir zéro ou plusieurs emplacements anonymes ? ou nommés :nom. Les deux types d'emplacements ne peuvent être mélangés dans la même requête. Elle retourne une requête SQL préparée sous forme d'objet PDOStatement.

La méthode PDOStatement::bindValue() de la classe PDOStatement permet d'associer par valeur les emplacements anonymes ou nommés de la requête aux valeurs ou variables passées en paramètres. Elle retourne TRUE en cas de succès et FALSE en cas d'erreur.

La méthode PDOStatement::bindParam() de la classe PDOStatement permet d'associer par référence les emplacements anonymes ou nommés de la requête aux variables en paramètres (les valeurs sont interdites). Elle retourne TRUE en cas de succès et FALSE en cas d'erreur.

La méthode PDOStatement::execute() de la classe PDOStatement permet d'associer (si ce n'est pas déjà fait avec la méthode PDOStatement::bindParam()) les emplacements anonymes ou nommés de la requête aux valeurs ou variables du tableau ou du tableau associatif respectivement passé en paramètres, et exécute la requête. Elle retourne TRUE en cas de succès et FALSE en cas d'erreur.

L'appel des méthodes PDO::prepare() et PDOStatement::execute() (et éventuellement PDOStatement::bindValue() ou PDOStatement::bindParam()) pour les requêtes SQL devant être exécutées plusieurs fois avec différentes valeurs de paramètres optimise les performances de l'application en autorisant le pilote à négocier coté client ou serveur avec le cache des requêtes et les méta-informations. Cela permet également de prévenir les attaques par injection SQL en éliminant le besoin de protéger les paramètres manuellement.

Exemples 
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ > ? AND mon_champ < ?";
$requete_preparee = $connexion->prepare($requete);
$resultat = $requete_preparee->execute(array(5, 13));
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ > ? AND mon_champ < ?";
$requete_preparee = $connexion->prepare($requete);
$requete_preparee->bindValue(1, 5);
$requete_preparee->bindValue(2, 13);
$resultat = $requete_preparee->execute();
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ > :mon_marqueur_1 AND mon_champ < :mon_marqueur_2";
$requete_preparee = $connexion->prepare($requete);
$resultat = $requete_preparee->execute(array(":mon_marqueur_1" => 5, "mon_marqueur_2" => 13));
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ > :mon_marqueur_1 AND mon_champ < :mon_marqueur_2";
$requete_preparee = $connexion->prepare($requete);
$requete_preparee->bindParam(":mon_marqueur_1", 5);
$requete_preparee->bindParam(":mon_marqueur_2", 13);
$resultat = $requete_preparee->execute();

Lecture du jeu de résultats[modifier | modifier le code]

  • PDOStatement::fetch() récupère la ligne suivante du jeu de résultats PDO.
  • PDOStatement::fetchAll() retourne un tableau contenant toutes les lignes du jeu de résultats PDO.
  • PDOStatement::fetchObject() récupère la ligne suivante et la retourne en tant qu'objet.
  • PDOStatement::fetchColumn() retourne une colonne depuis la ligne suivante du jeu de résultats PDO.
  • PDOStatement::rowCount() retourne le nombre de lignes affectées par le dernier appel à la fonction.
  • PDOStatement::closeCursor() libère la connexion au serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées. La requête reste dans un état lui permettant d'être de nouveau exécutée. Cette fonction retourne TRUE en cas de succès et FALSE en cas d'erreur.

La méthode PDOStatement::fetch() de la classe PDOStatement peut prendre en paramètre une constante de la classe PDO :

  • PDO::FETCH_ASSOC retourne le jeu de résultats sous forme d'un tableau associatif, dont la clé est le nom de colonne.
  • PDO::FETCH_NUM retourne le jeu de résultats sous forme d'un tableau.
  • PDO::FETCH_BOTH retourne le jeu de résultats sous forme d'un tableau ou d'un tableau associatif. C'est le paramètre par défaut.
  • PDO::FETCH_OBJ retourne le jeu de résultats sous forme d'un objet dont les noms de propriétés correspondent aux noms des colonnes.
Exemples 
while ($ligne = $resultat->fetch(PDO::FETCH_ASSOC)) {
    echo $ligne["champ_3"] . " " . $ligne["champ_1"] . "<br/>";
}
while ($ligne = $resultat->fetch(PDO::FETCH_NUM)) {
    echo $ligne[2] . " " . $ligne[0] . "<br/>";
}

Notes et références[modifier | modifier le code]

Liens externes[modifier | modifier le code]

Sur les autres projets Wikimedia :