0% ont trouvé ce document utile (0 vote)
150 vues22 pages

Accès aux bases de données avec PDO PHP

Ce document décrit l'utilisation de PDO pour se connecter à des bases de données et exécuter des requêtes SQL. Il explique la structure des classes PDO, la connexion, la préparation et l'exécution de requêtes, la gestion des erreurs et des transactions.

Transféré par

ahmed
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
150 vues22 pages

Accès aux bases de données avec PDO PHP

Ce document décrit l'utilisation de PDO pour se connecter à des bases de données et exécuter des requêtes SQL. Il explique la structure des classes PDO, la connexion, la préparation et l'exécution de requêtes, la gestion des erreurs et des transactions.

Transféré par

ahmed
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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