PDO définit une interface d’abstraction pour
accéder de manière uniforme aux bases de
données.
Il existe des implémentation pour la plupart
des SGDB connus.
PHP SGBD SGBD
PDO Driver
Avec les fonction mysql_*
<?php
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);
Avec PDO
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username',
'password');
Le premier paramètre est la DSN (Data Source Name). Il définit le driver du
SGBD auquel on veut accéder.
Les deux autres sont le nom d’utilisateur et le mot de passe
On peut passer un troisième qui contient un tableau de paramètres
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête SELECT :
$stmt = $db->query("SELSET * FROM table");
// $stmt est un objet de type « PDOStatment »
// Nombre d’enregistrements
echo $stmt->rowCount();
// Ici, on récupère tout les enregistrements dans un tableau associatif
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// PDO présente plusieurs constantes accessibles par PDO::*
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête INSERT:
$ret = $db->exec("INSERT INTO table (champ) VALUES ('valeur‘)");
// Récupration de la clé de l’enregistrement ajouté
$id = $db->lastInsertedId();
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête DELETE :
$ret = $db->exec("DELETE FROM table (champ) WHERE id<10)");
// Requête UPDATE :
$ret = $db->exec("UPDATE table SET champ='valeur‘ WHERE id=10)");
// $ret représente le nombre d’enregistrements affectés
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête préparée : $stmt est de type « PDOStatment
$id = 20;
stmt = $db->prepare("DELETE FROM table (champ) WHERE id=?)");
// Faire correspondre le paramètre représenté par « ? » :
$stmt->bindValue(1, $id, PDO::PARAM_INT);
// Exécuter la requête :
$stmt->execute();
// $stmt->rowCount() représente le nombre d’enregistrements affectés
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête préparée : $stmt est de type « PDOStatment
stmt = $db->prepare("SELECT * FROM table WHERE nom LIKE ?");
// Faire correspondre le paramètre représenté par « ? » :
$stmt->bindValue(1, '%'.$nom.'%', PDO::PARAM_STR);
// Exécuter la requête :
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
// Ici, $rows représente les enregistrements retournés sous forme
d’objets
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
// Requête préparée : $stmt est de type « PDOStatment
stmt = $db->prepare("SELECT * FROM table WHERE nom = :nom");
// Faire correspondre le paramètre représenté par « ? » :
$stmt->bindValue('nom', 'momo', PDO::PARAM_STR);
// Exécuter la requête :
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
// Ici, $rows représente les enregistrements retournés sous forme
d’objets
<?php
try {
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
stmt = $db->prepare("SELECT * FROM table WHERE nom = :nom");
$stmt->bindValue('nom', 'momo', PDO::PARAM_STRING);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
} catch( PDOException $e){
echo "Une erreur s’est produite. " . $e->getMessage();
}
<?php
try {
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
$db->beginTransaction(); // Démarrer une transaction
stmt = $db->prepare("INSERT INTO COMMANDES … ");
$stmt->execute(…);
$stmt = $db->prepare("INSERT INTO CLIENTS… ");
$stmt->execute(…);
$db->commit(); // Valider la transaction
} catch( PDOException $e){
echo "Une erreur s’est produite. " . $e->getMessage();
$db->rollBack(); // Annuler la transaction
}
On se propose de réaliser une application pour gérer
les utilisateurs.
Un utilisateur est caractérisé par un identificateur
(entier), un nom (string), un email (string) et un mot
de passe.
L’application doit permettre de :
ajouter un utilisateur
modifier un utilisateur
Supprimer un utilisateur
Afficher un utilisateur
Afficher tout les utilisateurs
// classes/metier/[Link]
namespace metier;
class User {
private $idUser;
private $name;
private $email;
private $password;
public function __construct($name, $email, $pasword)
{
$this->name = $name;
$this->email = $email;
$this->password = $pasword;
}
// getters et setters
}
// classes/metier/[Link]
namespace metier;
interface IAdmin {
function ajouterUtilisateur(User $user);
function modifierUtilisateur(User $user);
function supprimerUtilisateur(User $user);
function getUtilisateur($idUser);
function listerUtilisateurs();
}
// classes/metier/[Link]
namespace metier;
use metier\User;
class UserManager implements IAdmin
{
private $pdo = null;
function __construct($dbname, $userName, $password)
{
$this->pdo = new \PDO(
"mysql:host=localhost;dbname=$dbname;charset=utf8",
$userName, $password);
$this->pdo->setAttribute(
\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
function ajouterUtilisateur(User $user)
{
$stmt = $this->pdo->prepare("INSERT INTO users VALUES(null,?,?,?)");
$stmt->bindValue(1, $user->getName());
$stmt->bindValue(2, $user->getEmail());
$stmt->bindValue(3, $user->getPassword());
$stmt->execute();
}
// Suite
function modifierUtilisateur(User $user)
{
$stmt = $this->pdo->prepare(
"UPDATE users SET nom=:nom, email=:email,
password=:password WHERE user_id=:id");
$stmt->bindValue('id', $user->getIdUser());
$stmt->bindValue('nom', $user->getName());
$stmt->bindValue('email', $user->getEmail());
$stmt->bindValue('password', $user->getPassword());
$stmt->execute();
}
function supprimerUtilisateur(User $user)
{
$sql = "DELETE FROM users WHERE user_id=?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array($user->getIdUser()));
}
// Suite
function getUtilisateur($idUser)
{
$sql = "SELECT * FROM users WHERE user_id=?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array($idUser));
$row = $stmt->fetch(\PDO::FETCH_OBJ);
$user = null;
if ($row) {
$user = new User($row->nom, $row->email,
$row->password);
$user->setIdUser($row->user_id);
}
return $user;
}
// Suite
function listerUtilisateurs()
{
$sql = "SELECT * FROM users";
$stmt = $this->pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(\PDO::FETCH_OBJ);
$users = array();
foreach($rows as $row){
$user = new User($row->nom, $row->email,
$row->password);
$user->setIdUser($row->user_id);
$users[] = $user;
}
return $users;
}
// [Link]
function __autoload($className){
try{
$path = "classes" .
DIRECTORY_SEPARATOR .
str_replace("\\",
DIRECTORY_SEPARATOR,$className) .
".php";
require_once($path);
}catch(Exception $e){
echo $e->getMessage();
}
}
// [Link]
use metier\User;
use metier\UserManager;
require_once "[Link]";
// Création du manager
$um = new UserManager("mng", "root", "");
$user1 = new User("momo", "momo", "momo");
$user2 = new User("toto", "toto", "toto");
// Test Ajout des utilisateurs
echo "<hr>Ajout des utilisateurs<br>";
$um->ajouterUtilisateur($user1);
$um->ajouterUtilisateur($user2);
// Suite
// Test Lister Utilisateurs
echo "<hr>Lister les utilisateurs<br>";
foreach($um->listerUtilisateurs() as $user){
var_dump($user);
}
// Test Lister Utilisateurs
echo "<hr>Modifier tous les utilisateurs<br>";
foreach($um->listerUtilisateurs() as $user){
$user->setName(strtoupper($user->getName()));
$um->modifierUtilisateur($user);
}
foreach($um->listerUtilisateurs() as $user){
var_dump($user);
}
// Suite
// Test Suppression Utilisateurs
echo "<hr>Suppression tous les utilisateurs<br>";
foreach($um->listerUtilisateurs() as $user){
$um->supprimerUtilisateur($user);
}
// Afficher s'il ya encore des utilisateurs
var_dump($um->listerUtilisateurs());