FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireBases de donnéesAbstractionPDO

PDO (PHP Data Objects) est une extension PHP qui permet d'utiliser une base de données en programmant avec un style orienté objet, et surtout qui permet de s'affranchir du SGBD. PDO n'utilise pas des fonctions au nom trop explicite comme mysql_query() ou sqlite_query(), ce qui facilite grandement la migration d'un SGBD à l'autre, voire l'utilisation simultanée ou alternée de plusieurs SGBD avec le même code PHP.

PDO est une solution d'abstraction de BDD en PHP.

Le Zend Framework (par exemple) utilise PDO pour ses accès BDD.

Mis à jour le 12 août 2008  par Guillaume Rossolini

Lien : Comment uniformiser l'utilisation de différents SGBD ?
Lien : Cours et tutoriels Zend FrameworkCours et tutoriels ZF
Lien : La documentation de PDO (php.net)

La documentation officielle tient à jour une liste des pilotes disponibles avec PDO. Chaque pilote est associé à une extension qu'il faut penser à activer dans le fichier php.ini afin de pouvoir l'utiliser.

  • Firebird/Interbase 6 ;
  • FreeTDS / Microsoft SQL Server / Sybase (à ne pas utiliser, module non tenu à jour par Microsoft) ;
  • IBM DB2 ;
  • IBM Informix Dynamic Server ;
  • MySQL 3.x, 4.x, 5.x (optimisé pour 4.1 et supérieur) ;
  • ODBC v3 (IBM DB2 unixODBC et win32 ODBC) ;
  • Oracle Call Interface ;
  • PostgreSQL ;
  • SQLite 3 et SQLite 2.
Mis à jour le 8 mars 2011  par Guillaume Rossolini

Lien : Pilotes PDO (php.net)
Lien : Quels sont les pilotes de SGBD disponibles avec PEAR::MDB2 ?

PDO est une extension PHP. Il faut installer le pilote PDO générique ainsi que chacun des pilotes de SGBD que l'on souhaite utiliser : chacun d'eux est une extension PHP.

Créé le 10 juillet 2007  par Guillaume Rossolini

Lien : Comment installer une extension pour PHP ?

Il faut utiliser le script suivant :

 
Sélectionnez
<?php

foreach(get_loaded_extensions() as $extension)
{
    if(strpos(strtolower($extension), 'pdo') !== FALSE)
    {
        echo $extension.'<br/>';
    }
}

?>
Créé le 19 juillet 2007  par Guillaume Rossolini

La chaîne de connexion varie suivant le pilote SBGD utilisé, mais tout le reste est équivalent d'un SGBD à l'autre.

 
Sélectionnez
<?php

// Connexion à la base de données
$db = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');

// Configuration facultative de la connexion
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); // les noms de champs seront en caractères minuscules
$db->setAttribute(PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION); // les erreurs lanceront des exceptions

?>

Voici quelques exemples de chaînes de connexion :

MySQL (TCP)
Sélectionnez
$db = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
MySQL (socket)
Sélectionnez
$db = new PDO('mysql:unix_socket=/tmp/mysql.sock;dbname=developpez', 'Yogui', 'motdepasse');
ODBC (connexion cataloguée dans le Manager)
Sélectionnez
$db = new PDO('odbc:developpez', 'Yogui', 'motdepasse');
ODBC (IBM DB2)
Sélectionnez
$db = new PDO('odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=localhost;PORT=50000;"
."DATABASE=developpez;PROTOCOL=TCPIP;UID=Yogui;PWD=motdepasse;', '', '');
ODBC (MS Access)
Sélectionnez
$db = new PDO('odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\developpez.mdb;Uid=Yogui', '', '');
Oracle
Sélectionnez
$db = new PDO('oci:dbname=//localhost:1521/developpez', 'Yogui', 'motdepasse');
Firebird et Interbase
Sélectionnez
$db = new PDO('firebird:User=Yogui;Password=motdepasse;Database=developpez.gde;DataSource=localhost;Port=3050', '', '');
IBM DB2
Sélectionnez
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=developpez;HOSTNAME=localhost;PORT=56789;PROTOCOL=TCPIP;", "Yogui", "motdepasse");
Informix
Sélectionnez
$db = new PDO("informix:host=localhost; service=9800;
    database=developpez; server=ids_server; protocol=onsoctcp;
    EnableScrollableCursors=1", "Yogui", "developpez");
PostgreSQL
Sélectionnez
$db = new PDO('pgsql:host=localhost port=5432 dbname=developpez user=Yogui password=motdepasse', '', '');
SQLite 3
Sélectionnez
$db = new PDO('sqlite:/opt/databases/mydb.sq3', '', '');
SQLite 2
Sélectionnez
$db = new PDO('sqlite2:/opt/databases/mydb.sq2', '', '');
Créé le 10 juillet 2007  par Guillaume Rossolini

Lien : Quels sont les pilotes de SGBD disponibles avec PDO ?
Lien : Comment exécuter une requête en utilisant PDO ?
Lien : Comment construire l'objet $db avec le Zend Framework ?Comment construire l'objet $db avec le ZF ?

PDO est une extension orientée objet et qui utilise un système d'exceptions. L'instanciation d'un objet PDO doit donc se faire avec un bloc try/catch afin d'éviter des fuites d'information (exemple dans les liens ci-dessous).

 
Sélectionnez
<?php

try
{
// Connexion à la base de données
$db = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');

// Configuration du pilote : nous voulons des exceptions
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Obligatoire pour la suite
}
catch(Exception $e)
{
echo "Échec : " . $e->getMessage();
}

?>
Créé le 10 juillet 2007  par Guillaume Rossolini

Lien : Tutoriel : Exceptions et PHP5, par Guillaume AffringueTutoriel sur la gestion des exceptions sous PHP5

Le plus efficace est d'utiliser les requêtes préparées. Une requête préparée se matérialise dans le code par un "statement" PDO. Un statement peut être exécuté de nombreuses fois avec des paramètres différents.

 
Sélectionnez
<?php

// Connexion à la base de données
$db = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');

// Préparation des requêtes
$truncate = $db->prepare('TRUNCATE user');
$insert = $db->prepare('INSERT INTO user (name, password) VALUES (?, ?)');
$select = $db->prepare('SELECT id, name, password FROM user');
$select->setFetchMode(PDO::FETCH_ASSOC); // Facultatif

// Exécution des requêtes
$truncate->execute();
$insert->execute(array('Yogui', '1234'));
$insert->execute(array('BrYs', '4321'));
$select->execute();

// Récupération des résultats
$users = $select->fetchAll();
echo '<pre>';
print_r($users);
echo '</pre>';

?>

Note importante : utiliser des requêtes préparées élimine le risque d'injection SQL et accélère les performances.

Créé le 17 juin 2007  par Guillaume Rossolini

Lien : Tutoriel : Exceptions et PHP5, par Guillaume AffringueTutoriel sur la gestion des exceptions sous PHP5

Sous réserve que les extension php_pdo et php_pdo_mysql (pour cet exemple) soient montées en mémoire.

Contrairement à ce que l'on pourrait croire, la méthode 'rowCount()' ne fonctionne que dans les cas de requêtes de type INSERT, UPDATE ou DELETE.

 
Sélectionnez
<?php

// initialisation de la connexion PDO
$db = new PDO('mysql:host=localhost;dbname=training', 'eric', 'motdepasse');

// Exécution de la requête
$result = $db->query('SELECT * FROM country');

// Récupération de tous les enregistrements retourne un tableau
$countries = $result->fetchAll();

// Affichage comptage du nombre de lignes du tableau
echo(count($countries));

?>
Créé le 17 juin 2007  par Eric POMMEREAU

Lien : Comment se connecter en utilisant PDO ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.