Présentation de l'extension PDO
Pilote base de donnée: l'interface PDO permet d'accéder aux base de données les plus courantes:
- FreeTDS / Microsoft SQL Server / Sybase (PDO_DBLIB),
- Firebird / Interbase 6 (PDO_FIREBIRD),
- PostgreSQL (PDO_PGSQL),
- Microsoft SQL Server / SQL Azure (PDO_SQLSRV),
- SQLite 3 et SQLite 2 (PDO_SQLITE),
- et bien entendu ... MySQL 3.x/4.x/5.x (PDO_MYSQL).
Gestion des erreurs: les échecs de connexion ou les requêtes incorrectes génèrent une erreur de type PDOException. Elles sont traitées à la manière d'une class PHP5
<?php
try {
$pdo = new PDO('...');
$stmt = $pdo->query("...");
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Mise en garde: le connecteur aux bases de données est universel, par contre, chaque SGDB conserve certaines spécificités qui ne sont pas pris en charge par l'interface. Parfois le code source devra être adaptée à la base de donnée en ce concerne la syntaxe SQL ou la disponibilité de certaines fonctions par ex. rowCount().
Remplacer mysql_xxx par PDO
Pour une requete de sélection, voyons comment remplacer les fonctions mysql_xxx par celle de PDO. Si vos class MySQL contiennent déjà les requêtes préparées, la gestion des erreurs et les transactions, il y a peu de chose à modifier. D'une manière générale, l'utilisation de PDO apporte une clarté et de la rigueur dans la manière de développer en PHP.Base de donnée
Pour l'exemple d'une requête SELECT, nous allons utiliser une table nommée tbl_agenda
CREATE TABLE IF NOT EXISTS `tbl_agenda` (
`AGA_ID` int(11) NOT NULL auto_increment,
`AGA_NOM` varchar(64) NOT NULL,
`AGA_PRENOM` varchar(64) NOT NULL,
PRIMARY KEY (`AGA_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
-- Contenu de la table `tbl_agenda`
INSERT INTO `tbl_agenda` (`AGA_ID`, `AGA_NOM`, `AGA_PRENOM`) VALUES
(1, 'DUCHEMIN', 'Gérard'),
(2, 'GEORGES', 'Remy');
Sélection des données avec mysql_xxx
Pour sélectionner un ensemble de donnée avec les fonctions MySQL, le code source prend cette forme. Le style est volontairement 'PHP3 like' pour montrer la différence avec PDO.La gestion des erreurs est basique, dans le sens, les erreurs sont levées sans pour autant définir un traitement spécifiques aux problèmes rencontrés.
<?php
$DB_SERVER = "localhost";
$DB_USER = "user";
$DB_PASSWORD = "motdepasse";
$DB_NAME3 = "db3";
$SQL="SELECT * from tbl_agenda";
// Se connecter au serveur de base de données
mysql_connect($DB_SERVER, $DB_USER, $DB_PASSWORD) or die("Echec de connexion");
// Sélectionner la base
mysql_select_db($DB_NAME3) or die("BDD introuvable");
// Effectuer la requete
$query=mysql_query($SQL);
// Parcourir les données
while($row = mysql_fetch_assoc($query)){
print_r($row);
}
//Fermer la connexion
mysql_close();
?>
Array ( [AGA_ID] => 2 [AGA_NOM] => GEORGES [AGA_PRENOM] => Remy )
Sélection des données avec PDO
Avec les fonctions PDO, une requête est transmise de la même manière au serveur de base de donnée. Le constructeur de l'objet PDO fixe les propriétés suivantes:- le choix du pilote SGBD,
- l'adresse du serveur,
- le couple utilisateur et mot de passe,
- le nom de la base de donnée.
<?php
$DB_SERVER = "localhost";
$DB_USER = "user";
$DB_PASSWORD = "motdepasse";
$DB_NAME3 = "db3";
$DB_DRIVER = "mysql";
$SQL = "SELECT * from tbl_agenda";
try {
// Se connecter au serveur avec le pilote MySQL et sélectionner la base de données
$pdo = new PDO($DB_DRIVER . ':host=' . $DB_SERVER . ';dbname=' . $DB_NAME3, $DB_USER, $DB_PASSWORD);
// Effectuer la requete
$stmt = $pdo->query($SQL);
// Parcourir les données
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
// Fermer la connexion du serveur
$stmt->closeCursor();
//Détruire l'objet PDO
$pdo = null;
} catch (PDOException $e) {
//Exemple d'erreur possible
//SQLSTATE[28000] [1045] Access denied for user
//SQLSTATE[42000]: Syntax error or access violation
echo 'Error: ' . $e->getMessage();
}
?>
Array ( [AGA_ID] => 2 [AGA_NOM] => GEORGES [AGA_PRENOM] => Remy )