PDO, PHP Data Object
ENSET RABAT GLR [Link] 2014/2015
PDO, PHP Data Object
Objectifs de ce module
En suivant ce module vous allez :
Expliquer PDO.
Utilisez PDO dans un projet PHP.
Gérer les transactions avec PDO.
Expliquer et utiliser les
commandes préparées.
2014/2015
[Link]
GLR
ENSET RABAT
PDO, PHP Data Object
Plan du module
Voici les parties que nous allons aborder :
Introduction
Bases.
Gestion des transactions.
Les déclarations préparées.
2014/2015
[Link]
GLR
ENSET RABAT
PDO, PHP Data Object
Introduction
Pourquoi PDO ?
ENSET RABAT GLR [Link] 2014/2015
Introduction
Plan de la partie
Voici les points que nous allons aborder:
Avant PDO ......
...... et maintenant.
Architecture PDO.
Avantages.
Installation.
2014/2015
[Link]
GLR
ENSET RABAT
Introduction
Avant PDO…
PDO est uniquement disponible depuis PHP 5.
En PHP 4, vous devez utiliser l'une des extension
native dédiée à l'accès aux bases de données:
mysqli pour MySQL.
oci8 pour Oracle....
Chaque extension fournit différentes fonctions
spécifiques.
2014/2015
Besoin de changer le code si vous voulez changer
le SGBD!
[Link]
Les extensions ne sont pas orienté objet.
Pas une bonne approche ...
GLR
ENSET RABAT
Introduction
… et maintenant.
PDO est la principale nouveauté de PHP 5.1.
Offre une facilité d'utilisation et une plus grande
abstraction.
Une base commune pour tous les connecteurs SGBD:
Plus besoin de modifier le code lorsque vous
souhaitez changer de SGBD.
Ou presque ...
2014/2015
[Link]
GLR
ENSET RABAT
Introduction
PDO Architecture
PDO
MySQL
PDO
Oracle
PHP >= 5.1 PDO MySQL
2014/2015
PDO
SQL Server
[Link]
PDO
GLR
…
ENSET RABAT
Introduction
Avantages
PDO est écrit en langage C:
Performances similaires aux anciens pilotes natifs.
Opportunités d'optimisation grâce à des déclarations
préparées.
Non disponible avec l'ancienne extension MySQL
.PDO peut exécuter tous les types de requêtes:
INSERT, UPDATE, DELETE, SELECT
2014/2015
Procédure stockée.
[Link]
GLR
ENSET RABAT
Introduction
Installation
PDO et tous les grands pilotes avec PHP sont utilisés
en tant qu'extensions partagées.
Il vous suffit de les activer en éditant le fichier [Link]:
Si vous utilisez une version de PHP <5.3:
Ajouter ou décommenter la ligne suivante:
For all PHP version : ;(ou .dll sous Windows)
extension=php_pdo.so
2014/2015
Ajouter ou décommenter la ligne suivante :
[Link]
extension=php_pdo_mysql.so ;(ou .dll)
GLR
ENSET RABAT
Introduction
Avez-vous des questions?
2014/2015
[Link]
GLR
ENSET RABAT
PDO, PHP Data Object
Bases
connexion à une base de données, exécuter une
requête, ...
ENSET RABAT GLR [Link] 2014/2015
Bases
Plan de la partie
Voici les points que nous allons aborder:
Classes PDO.
Exemple de PDO.
Connexion de base de données.
Effectuer une requête.
Récupérer les résultats.
Les types de Fetch.
20123
[Link]
3ième ISI
ENSET RABAT
Bases
PDO Classes
Les trois principales catégories de classes PDO que
nous utilisons sont:
PDO: Connexion à une base de données.
PDOStatement: représente une déclaration et ses
résultats.
PDOexception: Exception levée lorsqu'une erreur
se produit.
2014/2015
[Link]
GLR
ENSET RABAT
Bases
PDO Exemple
$u= 'root';
$p = '';
$dsn = 'mysql:host=localhost;dbname=Exemple';
try {
$pdo = new PDO($dsn, $u, $p);
} catch (PDOexception $e) {
die("Error ! : ".$e->getMessage());
}
2014/2015
$pdo->exec("INSERT INTO exemple(col) VALUES ('val')");
$result = $pdo->query("SELECT col FROM exemple");
[Link]
while($row = $result->fetch()) {
print_r($row);
GLR
}
ENSET RABAT
$pdo = NULL;
Bases
Connexion à la base de données
La première chose à faire est de créer une instance de la classe
PDO.
Le constructeur prend trois paramètres:
DSN (Nom de la source base de données):
Les informations concernant la base de données à utiliser.
Exemple pour une base de données MySQL
mysql:host=localhost;port=3306;dbname=Exemple
2014/2015
Le nom d'utilisateur à utiliser pour se connecter à la
base de données.
Le mot de passe du compte.
[Link]
Créer une instance PDO peut lever une exception:
GLR
Si le driver requis n'est pas chargé.
ENSET RABAT
Si l'accès est refusé.
Bases
Connexion à la base de données
Pour utiliser plusieurs bases de données, il suffit
de créer plusieurs instance PDO:
$u1 = 'root'; $p1 = '';
$dsn1 = 'mysql:host=localhost;dbname=Exemple1';
try {
$pdo1 = new PDO($dsn1, $u1, $p1);
} catch (PDOexception $e) { die(); }
2014/2015
$u2 = 'root';
$p2 = '';
$dsn2 = 'mysql:host=localhost;dbname=Exemple2';
[Link]
try {
GLR
$pdo2 = new PDO($dsn2, $u2, $p2);
ENSET RABAT
} catch (PDOexception $e) { die(); }
Bases
Execution de requêtes
Une fois que votre connexion est ouverte, vous pouvez
exécuter la requête grâce à deux méthodes d'instance
PDO:
int exec ( string $statement ) :
Exécute une instruction SQL dans un seul appel
de fonction, retourne le nombre de lignes
affectées par l'instruction
PDOStatement query ( string $statement ) :
2014/2015
Exécute une instruction SQL dans un seul appel
de fonction, retourne le jeu de résultats (le cas
[Link]
échéant) renvoyée par l'instruction comme un
objet PDOStatement
GLR
ENSET RABAT
Bases
Execution de requêtes
Instruction SQL Méthode PDO
INSERT exec()
UPDATE exec()
DELETE exec()
SELECT query()
2014/2015
EXPLAIN query()
[Link]
SHOW query()
GLR
DESC query()
ENSET RABAT
Bases
Récupérer des données
Après un appel à la méthode query() les données extraites sont
conservées en mémoire, à l'intérieur d'une instance de
PDOStatement.
Les deux principales méthodes pour manipuler ces données sont
les suivantes:
array fetchAll( [ $fetch_style=PDO::FETCH_BOTH] )
Retourne un tableau contenant toutes les lignes du résultat
d'ensemble..
2014/2015
mixed fetch( [$fetch_style=PDO::FETCH_BOTH] )
Lit une ligne dans un jeu de résultats associé à un objet
[Link]
PDOStatement.
Le paramètre fetch_style détermine la façon dont PDO retourne
GLR
la ligne..
ENSET RABAT
Bases
Récupérer des données
La méthode fetchAll () retourne toutes les données
dans un tableau.
Très facile à utiliser!
Mais ce n'est pas conseillé si la requête retourne
un grand nombre de résultat!
Dans ce cas, la méthode fetch () est le meilleur
choix!
2014/2015
[Link]
GLR
ENSET RABAT
Bases
Récupérer des données
Exemple de Fetch all :
$sql = "SELECT nom_utilisateur, mot_passe FROM
utilisateurs";
$sth = $pdo->query($sql);
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach($result as $row) {
echo $row['nom_utilisateur'].'-'.
$row['mot_passe'].'<br/>';}
Exemple de fetch séquentiel :
2014/2015
$sql = "SELECT nom_utilisateur, mot_passe FROM
utilisateurs";
[Link]
$sth = $pdo->query($sql);
GLR
while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
ENSET RABAT
echo $row['nom_utilisateur'].'-'.
$row['mot_passe'].'<br/>';}
Bases
Styles de Fetch
VALUE ACTION
Retourne un tableau indexé par nom
PDO::FETCH_ASSOC de colonne comme un jeu de
résultats.
Retourne un tableau indexé par le
PDO::FETCH_NUM numéro de colonne retourné dans le
jeu de résultats, en commençant à 0.
Retourne un tableau indexé par le
PDO::FETCH_BOTH nom et le numéro de la colonne
2014/2015
indexée dans le jeu de résultats.
Retourne un objet anonyme avec les
noms de propriétés correspondant
PDO::FETCH_OBJ
[Link]
aux noms des colonnes retournées
dans le jeu de résultats.
GLR
Retourne une nouvelle instance de la
classe demandée, liant les colonnes
ENSET RABAT
PDO::FETCH_CLASS du jeu de résultats aux propriétés
nommées dans la classe.
Bases
Styles de Fetch
PDO::FETCH_ASSOC :
$sql = "SELECT nom_utilisateur, mot_passe FROM
utilisateurs";
$sth = $pdo->query($sql);
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
Array
2014/2015
(
[0] => Array
(
[Link]
[nom_utilisateur] => ENSET
[mot_passe] => 1234
GLR
)
ENSET RABAT
)
Bases
Styles de Fetch
PDO::FETCH_BOTH :
$sql = "SELECT nom_utilisateur, mot_passe FROM
utilisateurs";
$sth = $pdo->query($sql);
$result = $sth->fetchAll(PDO::FETCH_BOTH);
print_r($result);
Array
2014/2015
(
[0] => Array
(
[nom_utilisateur] => ENSET
[Link]
[0] => ENSET
[mot_passe] => 1234
GLR
[1] => 1234
ENSET RABAT
)
Bases
Styles de Fetch
PDO::FETCH_OBJ :
$sql = "SELECT nom_utilisateur, mot_passe FROM
utilisateurs";
$sth = $pdo->query($sql);
$result = $sth->fetchAll(PDO::FETCH_OBJ);
print_r($result);
2014/2015
Array
(
[0] => stdClass Object
(
[Link]
[nom_utilisateur] => ENSET
[mot_passe] => 1234
GLR
)
ENSET RABAT
)
Bases
Dernier ID inseré
Lorsque vous insérez une nouvelle ligne dans une table, c’est
fréquemment le SGBD qui génère la clé primaire.
Vous pouvez récupérer le dernier ID généré grâce à la méthode
d'instance de PDO:
String lastInsertId ([string $ name = NULL]):
Si un nom de séquence n'a pas été spécifié pour le
paramètre de nom, retourne une chaîne représentant l'ID de
ligne de la dernière ligne insérée.
2014/2015
Sinon, retourne une chaîne représentant la dernière valeur
récupérée à partir de l'objet de séquence spécifiée.
[Link]
$sql = "INSERT INTO utilisateurs (nom_utilisateur,
mot_passe) VALUES ('isi.g1', 'ENSET')”;
$pdo->exec($sql);
GLR
echo $pdo->lastInsertId();
ENSET RABAT
// Afficher le dernier ID généré
ENSET RABAT GLR [Link] 2014/2015
Bases
Avez-vous des questions?
Bases
Exercices
Maintenant, vous savez comment utiliser la base de
données en PHP avec PDO!
Créer deux nouvelles classes:
PdoUserManager implémente l'interface
UserManager.
PdoPostManager implémente l'interface
PostManager.
Mettre en œuvre des méthodes utilisant PDO et une
2014/2015
base de données MySQL.
Mettez à jour votre page PHP pour utiliser vos nouveaux
[Link]
administrateurs à la place des anciens.
S’Ils ne sont pas enregistrés, ajouter les directement
GLR
dans la base avec l’outil MySQL phpMyAdmin.
ENSET RABAT