PDO vite dit...

vendredi 31 octobre 2008, par Minimalteck

 PDO en bref :

Introduit en PHP 5.1, cette extension PECL permet d’utiliser de façon standardisée plusieurs types de SGBD via l’utilisation de drivers spécifiques. Proche de PEAR DB dans son utilisation, PDO est beaucoup plus rapide car écrite en C : ses performances sont proches des anciens drivers natifs.

 Les Classes de PDO :

- 3 principales :

  • PDO, gérant la connexion entre PHP et un serveur de base de données ;
  • PDOStatement, représentant une requête préparée et qui fournit une fois cette dernière exécutée, le jeu de résultats associé ;
  • PDOException, permettant le traitement des erreurs.

- Connexion à un SGDB :
PDO utlise un DSN pour décrire la base de données à laquelle on souhaite se connecter, comme pour PEAR DB…
Ce DSN va être passer en paramêtre au moment de l’instanciation de la classe PDO :

PDO::__construct  ( string $dsn  [, string $username  [, string $password  [, array $driver_options  ]]] )
$db = new PDO ('driver_type:host=hostname;dbname=name_of_db', 'user', 'user_password');

Mais attention, la syntaxe du DSN varie en fonction du SGDB utilisé (cf. http://fr.php.net/manual/fr/pdo.dri…) !
Ainsi, pour Mysql (driver : pdo_mysql et DSN) on peut avoir en DSN :

mysql:host=hostname;dbname=name_of_database
mysql:host=hostname;port=num_port;dbname=name_of_database
mysql:unix_socket=/path/to/mysql.sock;dbname=name_of_database

- Gestion des erreurs et fermeture de connexions :

<?php
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=dbtest';
$user = 'user';
$password = 'passwd';
try {
        $db = new PDO ($dsn,$user,$password);
} catch (PDOException $e) {
        var_dump($e->getMessage());
        die();
}
if ($db) {
        $db = NULL; //On ferme la connexion en assignant la valeur "NULL" à la variable gérant l'instance PDO
}

?>

 - Méthodes pour exécuter une requête :

Il existe 2 méthodes : exec() et query().

  • query() : Pour les requêtes du type SELECT, EXPLAIN, SHOW, DESC, SET… Retourne une instance PDOStatement pour le traitement des résultats
  • exec() : Pour les requêtes ne renvoyant pas de jeu de résultats, comme INSERT, DELETE, UPDATE , REPLACE.
    Cette méthode retourne le nombre de lignes affectées [*]

En cas d’erreur ces 2 méthodes renvoient FALSE.
Il est donc impératif d’utiliser le comparateur de valeur "===" et non le comparateur de type "==" si l’on veut effectuer un test sur la requête… car une requête valide peut retourner la valeur 0 (aucun résultat) !

if ($db->query($request) === FALSE){
        echo 'Peste ! Une erreur inopinée est survenue !';
        die();
}

 - Requête de selection, traitement des résultats

2 Méthodes :

  • PDOStatement ::fetch : récupère une ligne depuis un jeu de résultats associé à l’objet PDOStatement. PDOStatement ::closeCursor() libère la connexion du serveur, permettant ainsi à d’autres requêtes SQL d’être exécutées, mais quitte la requête, permettant ainsi qu’elle soit de nouveau exécutée.
  • PDOStatement ::fetchAll : retourne un tableau contenant toutes les lignes du jeu d’enregistrements.

 Traitements de tous les résultats :

- La méthode fetchAll() renvoie un tableau contenant TOUS les résultats de la requête : il suffit donc de parcourir ce tableau pour extraire les résultats :

$sth = $db->query('SELECT id, name FROM person WHERE 1');
$results = $sth->fetchAll(PDO::FECTH_ASSOC);
foreach ($result as $row){
        echo $row['id']. ': '.$row['name'].'<br />';
}
$db = NULL;

- La méthode séquentielle fetch() retourne les résultats ligne par ligne permettant ainsi de ne pas charger l’ensemble des résultats en mémoire, utile surtout pour un grand nombre d’enregistrements.

$sth = $db->query('SELECT id, name FROM person WHERE 1');
while ($row = $sth->fetch(PDO::FECTH_ASSOC);){
        echo $row['id']. ': '.$row['name'].'<br />';
}
/* L'appel suivant à closeCursor() peut être requis par quelques drivers, notamment Mysql */
$sth->closeCursor();
$db = NULL;

Bon, maintenant qu’on a appréhender la bête, Allez on code ! Voir comment se passe l’interfaçage avec les autres packages PEAR, je pense à PAGER notamment…

Notes

[*] 2 dans le cas d’un REPLACE !!! petit rappel pour un dév fatigué qui se reconnaîtra… :-p

SPIP | squelette | | Plan du site | Suivre la vie du site RSS 2.0