Vous êtes sur la page 1sur 22

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?

Vous aimerez peut-être aussi