AccueilđŸ‡«đŸ‡·Chercher

PHP Data Objects

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.

Compatibilité avec les versions de PHP

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

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

Classes

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

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 ;
  • l'identifiant et le mot de passe.

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");

Passage de requĂȘtes SQL

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.

$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.

$requete = "SELECT * FROM ma_table WHERE mon_champ = ma_valeur"
$resultats = $connexion->query($requete);

Passage de requĂȘtes SQL prĂ©parĂ©es

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.

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.

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.

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.

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.

Exemples
$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();

Lecture du jeu de résultats

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() 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 de 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
$ligne = $resultats->fetch(PDO::FETCH_ASSOC);
$ligne = $resultats->fetch(PDO::FETCH_NUM);
$ligne = $resultats->fetch(PDO::FETCH_BOTH);
$ligne = $resultats->fetch(PDO::FETCH_OBJ);

Notes et références

  1. « Manual », sur php.net (consulté le ).
  2. « php.net/manual/fr/pdo.drivers.
 »(Archive.org ‱ Wikiwix ‱ Archive.is ‱ Google ‱ Que faire ?).

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.