Cet article est une ébauche concernant l’informatique.
PHP Data Objects (PDO) est une extension définissant l'interface pour accéder à une base de données avec PHP.
Elle est orientée objet, la classe s’appelant PDO. PDO constitue une couche d'abstraction qui intervient entre l'application PHP et un système de gestion de base de données (SGDB) tel que MySQL, PostgreSQL ou MariaDB par exemple. La couche d'abstraction permet de séparer le traitement de la base de données proprement dite. PDO facilite donc la migration 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 de la méthode envoyés au constructeur.
Pour récupérer les enregistrements d’une table de la base de données, la procédure classique en PHP consiste à parcourir cette table ligne par ligne en procédant à des aller-retour entre l'application PHP et le SGBD. Ceci risque d’alourdir le traitement surtout si les deux serveurs sont installés chacun sur une machine différente. PDO corrige 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 le temps de traitement.
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.
php_pdo.dll
extension=php_pdo_[SGBD utilisé].dll
De nombreux pilotes sont disponibles pour PDO. On trouve la liste à jour sur le site php.net[2].
PDO comporte trois classes :
PDO
PDOStatement
PDOException
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 :
Pour accéder à une base de données MySQL de nom ma_bdd accessible sur le port mon_port du serveur mon_serveur avec l'identifiant mon_identifiant associé au mot de passe mon_mdp, le code sera le suivant :
$connexion = new PDO("mysql:host=mon_serveur;dbname=ma_bdd;port=mon_port", "mon_identifiant", "mon_mdp");
Des méthodes de la classe PDO permettent de passer différentes requêtes SQL à l'objet récupéré lors de la connexion. La méthode PDO::exec() permet de passer et exécuter une requête SQL de type INSERT, UPDATE et DELETE. Elle retourne le nombre de lignes affectées par la requête.
PDO::exec()
$requete = "DELETE FROM ma_table WHERE mon_champ = ma_valeur"; $compteur = $connexion->exec($requete);
La méthode PDO::query() permet de passer et exécuter une requête SQL de type SELECT. Elle retourne le jeu de résultats sous forme d'objet PDOStatement.
PDO::query()
$requete = "SELECT * FROM ma_table WHERE mon_champ = ma_valeur" $resultats = $connexion->query($requete);
La méthode PDO::prepare() 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.
PDO::prepare()
?
:nom
La méthode PDOStatement::bindValue() 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.
PDOStatement::bindValue()
La méthode PDOStatement::bindParam() permet d'associer par référence les emplacements anonymes ou nommés de la requête aux variables passées en paramètres (les valeurs sont interdites). Elle retourne TRUE en cas de succès et FALSE en cas d'erreur.
PDOStatement::bindParam()
La méthode PDOStatement::execute() permet d'associer par valeur les emplacements anonymes de la requête aux valeurs ou variables du tableau passé en paramètre, ou d'associer les emplacements nommés de la requête aux valeurs ou variables du tableau associatif passé en paramètre, et exécute la requête. Elle retourne TRUE en cas de succès et FALSE en cas d'erreur.
PDOStatement::execute()
La méthode PDO::prepare() compile le modèle de requête (requête paramétrée) et la stocke dans un cache sans l'exécuter. Par la suite, la méthode PDOStatement::execute() lie les valeurs fournies aux paramètres du modèle de requête et exécute la requête formée. Le premier avantage des requêtes préparées tient dans l'impossibilité pour des hackers d'injecter du code malicieux via des paramètres, puisque seul le modèle de la requête est compilé. Le second avantage réside dans le gain de performance lorsqu'un modèle de requête doit être exécuté plusieurs fois avec différentes valeurs de paramètres, car le modèle de requête n'est compilé qu'une seule fois.
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ_1 = ? AND mon_champ_2 = ?"; $resultats = $connexion->prepare($requete); $resultats->execute(array(5, 13));
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ_1 = ? AND mon_champ_2 = ?"; $resultats = $connexion->prepare($requete); $resultats->bindValue(1, 5); $resultats->bindValue(2, 13); $resultats->execute();
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ_1 = :mon_marqueur_1 AND mon_champ_2 = :mon_marqueur_2"; $resultats = $connexion->prepare($requete); $resultats->execute(array(":mon_marqueur_1" => 5, ":mon_marqueur_2" => 13));
$requete = "SELECT mon_champ FROM ma_table WHERE mon_champ_1 = :mon_marqueur_1 AND mon_champ_2 = :mon_marqueur_2"; $resultats = $connexion->prepare($requete); $resultats->bindValue(":mon_marqueur_1", 5); $resultats->bindValue(":mon_marqueur_2", 13); $resultats->execute();
La méthode PDOStatement::fetch() de la classe PDOStatment permet de rendre exploitable l'objet récupéré lors de la connexion après lui avoir passé différentes requêtes SQL.
PDOStatement::fetch()
PDOStatement::fetchAll()
PDOStatement::fetchObject()
PDOStatement::fetchColumn()
PDOStatement::rowCount()
PDOStatement::closeCursor()
La méthode PDOStatement::fetch() de la classe PDOStatement peut prendre en paramètre une constante de la classe PDO :
PDO::FETCH_ASSOC
PDO::FETCH_NUM
PDO::FETCH_BOTH
PDO::FETCH_OBJ
$ligne = $resultats->fetch(PDO::FETCH_ASSOC); $ligne = $resultats->fetch(PDO::FETCH_NUM); $ligne = $resultats->fetch(PDO::FETCH_BOTH); $ligne = $resultats->fetch(PDO::FETCH_OBJ);
Sur les autres projets Wikimedia :