Développement
d’applications Web
PHP: PARTIE 3
ACCÈS AUX BASES DE DONNÉES
PDO: PHP DATA OBJECT
Architecture des drivers PDO
Bases de données supportées
Nom du driver Bases de données supportées
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_IBM IBM DB2
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x/5.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC et win32 ODBC)
PDO_SQLITE SQLite 3 et SQLite 2
PDO_PGSQL PostgreSQL
PDO_4D 4D
Structure des classes de PDO
Lien entre Les requêtes
script PHP et et leur
la BD résultat
Traitement
des erreurs
Classes prédéfinies
PDO
Connexion PHP/Base de données
__construct()
exec(), prepare(), query()
errorCode(), errorInfo()
getAttributes(), setAttribute()
lastInsertId(), quote()
beginTransaction()
commit(), rollBack()
getAvailableDrivers()
Classes prédéfinies
PDOStatement
requête préparée, jeu de résultats
bindColumn(), bindParam(), bindValue(), closeCursor()
errorCode(), errorInfo()
fetch(), fetchAll(), fetchColumn(), fetchObject(),
setFetchMode(), nextRowset()
rowCount(), columnCount(), getColumnMeta()
getAttribute(), setAttribute()
execute()
debugDumpParams()
Connexion
Instanciation d'un objet PDO
$pdo=new PDO(DSN [, user [, pass [, options]]]);
DSN : Data Source Name
nom_du_driver:syntaxe_spécifique_au_driver
Exemple : mysql:host=localhost;dbname=ma_base
user : nom d'utilisateur, pass : mot de passe
options : tableau associatif spécifique au driver
Exemple : array(PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)) ;
Fin de connexion :
unset($pdo) ;
Gestion des erreurs de connexion
Exemple
<?php
try {
$pdo = new PDO($dsn, $user, $pass) ;
//…Traitement
$pdo = null ;
}
catch (PDOException $e) {
echo "Erreur: ".$e->getMessage()."<br>" ;
die() ;
}
?>
Exécution d'une requête
PDOStatement PDO::query ( string statement )
Exemple
<?php
try {
$pdo = new PDO ($dsn, $user, $pass) ;
$pdostat = $pdo->query("SELECT * FROM clients") ;
}
catch (PDOException $e) {
echo "Erreur: ".$e->getMessage()."<br>" ;
}
?>
Exploitation des résultats d'une requête
2 étapes:
Récupération des données ligne à ligne; Une ligne peut être :
un tableau indexé
un tableau associatif
un tableau mixte (par défaut)
un objet anonyme/d'une classe définie par l'utilisateur
Récupération des données d'une colonne
Exploitation des résultats d'une requête
Exemple
$pdo=new PDO ($dsn, $user, $pass) ;
$pdostat = $pdo->query("SELECT * FROM user") ;
$pdostat->setFetchMode(PDO::FETCH_ASSOC) ;
foreach ($pdostat as $ligne) {
//…Traitement
}
}
catch (Exception $e) {
echo "ERREUR : ".$e->getMessage() ;
}
Exploitation des résultats d'une requête
Exemple
$pdo=new PDO ($dsn, $user, $pass) ;
$pdostat = $pdo->query("SELECT * FROM user") ;
foreach ($pdostat->fetchAll(PDO::FETCH_ASSOC) as $ligne) {
//…Traitement
}
}
catch (Exception $e) {
echo "ERREUR : ".$e->getMessage() ;
}
Exploitation des résultats d'une requête
Avec la méthode fecthAll(), tous les enregistrements sont
renvoyés dans un tableau (donc dans la mémoire). Il suffit de
parcourir le tableau en affichant son contenu.
La méthode fetchAll() ne convient pas si la requête renvoie un
grand nombre de résultats.
Dans ce cas, on utilise la méthode séquentielle fetch() qui
cherche les enregistrements les uns après les autres.
while($ligne = $pdostat-> fetch(PDO::FETCH_ASSOC)){
//…Traitement
}
Modes de récupération des données
PDO::FETCH_ASSOC
retourner chaque ligne dans un tableau indexé par les noms des
colonnes ,comme elles sont retournées dans le jeu de résultats
correspondant.
PDO::FETCH_NUM
retourner chaque ligne dans un tableau indexé par le numéro des
colonnes comme elles sont retournées dans le jeu de résultats
correspondant, en commençant à 0.
PDO::FETCH_BOTH
retourner chaque ligne dans un tableau indexé par les noms des
colonnes ainsi que leurs numéros, comme elles sont retournées dans le
jeu de résultats correspondant, en commençant à 0.
PDO::FETCH_OBJ
retourner chaque ligne dans un objet avec les noms de propriétés
correspondant aux noms des colonnes comme elles sont retournées
dans le jeu de résultats
Requêtes insert/update/delete
Pour les requêtes d’insertion et de modification, on utilise la méthode
exec() de la classe PDO.
La méthode exec() permet d’exécuter une requête et ne renvoie que
le nombre de lignes modifiées : on s’en servira généralement pour
faire des insertions, des modifications ou des suppressions.
Si aucune ligne n'est affectée, la méthode PDO::exec() retournera 0.
Si la méthode exec() ne peut s’effectuer (à cause d’une mauvaise
requête SQL par exemple) la valeur de retour sera FALSE.
Requêtes insert/update/delete
Exemple
// Insertion d’un enregistrement
$req = "INSERT INTO auteur (login, nom, prenom)
VALUES ('Alfredo','Bie', 'Alfred')";
$retour = $pdo->exec($req );
// Suppression d’un enregistrement
$req= "DELETE FROM auteur WHERE prenom='John'";
$retour = $pdo->exec($req );
if ($retour === FALSE)
die('Erreur dans la requête') ;
elseif($retour === 0)
echo 'Aucune modification effectuée';
else
echo $retour . ' lignes ont étés affectées.';
Préparation d'une requête
Déroulement d'une requête SQL
1. Analyse
2. Compilation
3. Optimisation
4. Exécution
Exécution répétée d'une requête : 1+2+3+4
Préparation d'une requête : 1+2+3
Exécution répétée d'une requête préparée : 4
Préparation d'une requête
PDOStatement PDO::prepare(string statement [,array driver_options])
statement : la requête à préparer. Peut contenir des paramètres
anonymes (?) ou nommés (:nom)
driver_options : tableau d'options du driver
retourne un objet PDOStatement qui effectuera l'association des
paramètres et exécutera la requête
Exemple
$pdo=new PDO ($sdn, $user, $pass);
$pdostat = $pdo->prepare(
"SELECT * FROM user WHERE User= ?") ;
$pdostat->bindValue(1, 'root') ;
$pdostat->execute() ;
Association des paramètres d'une requête
bool PDOStatement::bindValue(parameter, value [,int data_type])
parameter : le paramètre (nom ou position [1…n])
value : sa valeur
data_type : le type de la valeur
PDO::PARAM_BOOL booléen.
PDO::PARAM_NULL NULL SQL.
PDO::PARAM_INT INTEGER SQL.
PDO::PARAM_STR CHAR, VARCHAR ou autre chaîne.
PDO::PARAM_LOB "objet large" SQL.
bool PDOStatement::execute([array parameters])
parameters : tableau associatif ou indexé des valeurs
Transactions
Transactions :
Atomicité, Consistance, Isolation et Durabilité
BEGIN puis COMMIT ou ROLLBACK
Mode PDO par défaut :
Chaque requête est validée automatiquement
Syntaxe
PDO::beginTransaction()
PDO::commit()
PDO::rollBack()
Transactions
Exemple
<?php
$pdo = new PDO($sdn, $user, $pass);
$pdo->beginTransaction();
$success = $pdo->exec("UPDATE account SET
balance=balance-1 WHERE name='a'");
if ($success === False)
{ $pdo->rollback(); exit(); }
$success = $pdo->exec("UPDATE account SET
balance=balance+1 WHERE name='b'");
if ($success === False)
{ $pdo->rollback(); exit(); }
$pdo ->commit();
?>
Questions?