PHP Data Objects

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

PDO (PHP Data Objects) 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 version de PHP[modifier | modifier le code]

PDO est fourni avec PHP 5.1.
PDO est disponible en tant qu'extension PECL pour PHP 5.0.
PDO ne fonctionne donc pas avec les versions antérieures de PHP car il nécessite les fonctionnalités OO 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 de "php_pdo.dll" dans php.ini.
Pour activer le SGBD, il faut ensuite écrire : extension=php_pdo_[SGBD utilisé].dll.

Pilotes disponibles pour PDO[modifier | modifier le code]

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

  • CUBRID
  • MS SQL Server
  • Firebird
  • IBM
  • Informix
  • MySQL
  • MS SQL Server
  • Oracle
  • ODBC et DB2
  • PostgreSQL
  • SQLite
  • 4D

Les classes de l'extension PDO[modifier | modifier le code]

L'extension PDO comporte 3 classes :

  • La classe PDO correspond à une connexion à la base de données.
  • La classe PDOStatement représente d'une part une requête 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, de comptage, d'informations.

  • La classe PDOException représente une erreur émise par PDO.

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

L'accès à la base de données se fait en instanciant un objet 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_mot_de_passe, le code sera le suivant :

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

Passer des requêtes en PDO[modifier | modifier le code]

Des méthodes permettent de passer des requêtes à l'objet récupéré lors de la connexion.

  • PDO::exec(string $statement)

La méthode exec() 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 matable WHERE champ1='mavaleur'";
$resultat=$connexion->exec($requete);
echo $resultat.' suppressions effectuées';
  • PDO::query(string $statement)

La méthode query() 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 champ1, champ2 FROM matable";
$resultat=$connexion->query($requete);

Quelques méthodes de PDOStatement[modifier | modifier le code]

  • PDOStatement::fetch() récupère la ligne suivante d'un jeu de résultats PDO.
  • PDOStatement::fetchAll() retourne un tableau contenant toutes les lignes du jeu d'enregistrements 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 d'un jeu de résultats PDO.
  • PDOStatement::rowCount() retourne le nombre de lignes affectées par le dernier appel à la fonction. Elle ne fonctionne qu'avec des requêtes de type INSERT, UPDATE ou DELETE.
  • 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 ou FALSE si une erreur survient.

Les paramètres de la méthode fetch[modifier | modifier le code]

La méthode fetch()peut avoir en paramètre le type de retour du résultat. Par défaut, sans paramètre, le paramètre implicite est PDO::FETCH_BOTH.

  • PDO::FETCH_ASSOC retourne le jeu de résultats sous forme d'un tableau associatif, dont la clé est le nom de colonnes.

Exemple d'utilisation :

while ($ligne = $resultat ->fetch(PDO::FETCH_ASSOC)) {    
 echo $ligne['champ3'].' '.$ligne['champ1'].'<br/>';   
}
  • PDO::FETCH_NUM retourne le jeu de résultats sous forme d'un tableau indexé par numéro commençant à 0.

Exemple d'utilisation :

while ($ligne = $resultat ->fetch(PDO::FETCH_NUM)) {    
 echo $ligne[2].' '.$ligne[0].'<br/>';   
}
  • PDO::FETCH_BOTH retourne un tableau indexé et un tableau associatif.
  • 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.

Faire une requête préparée avec PDO[modifier | modifier le code]

PDO::prepare() permet de préparer une requête que l'on exécutera ensuite avec la méthode PDOStatement::execute().

PDOStatement::execute(): Méthode qui permet d'exécuter une requête préparée.

Les variables (parties de la requête spécifiques au moment de l'exécution) seront passées à la requête préparée grâce à cette méthode execute(). Ce dispositif protège l'application d'attaque de type Injection SQL.

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

Liens externes[modifier | modifier le code]