Académique Documents
Professionnel Documents
Culture Documents
coté serveur
PDO : PHP Data Object
2022
1
INTRODUCTION
2
PDO
3
Bases de données supportées
4
LES CLASSES DE PDO
5
Classes prédéfinies
PDO :
connexion PHP / base de données
__construct()
__construct()
exec(),
exec (), prepare
prepare(), (), query()
query()
errorCode(),
errorCode (), errorInfo
errorInfo() ()
getAttributes(),
getAttributes (), setAttribute()
setAttribute()
lastInsertId(),
lastInsertId (), quote()
quote()
beginTransaction()
beginTransaction ()
commit(), rollBack()
rollBack()
getAvailableDrivers()
getAvailableDrivers ()
PDOStatement :
requête préparée, jeu de résultats
bindColumn(), bindParam(),
bindColumn(), bindParam(), bindValue(),
bindValue(),
closeCursor()
closeCursor ()
errorCode(),
errorCode (), errorInfo()
errorInfo()
fetch(),
fetch(), fetchAll
fetchAll(),(), fetchColumn(),
fetchColumn(), fetchObject(),
fetchObject(),
setFetchMode(),
setFetchMode (), nextRowset()
nextRowset()
rowCount(),
rowCount (), columnCount(),
columnCount(), getColumnMeta()
getColumnMeta()
getAttribute(),
getAttribute (), setAttribute()
setAttribute()
execute()
execute ()
debugDumpParams()
debugDumpParams ()
7
COMMENT SE CONNECTER ?
8
Connexions et gestionnaire de connexion
Exemple
Nom de la BD
<?php
$user= "user1";
$pass
pass== "user1pass";
$dbh = new PDO ('mysql:host
PDO(' mysql:host==localhost;dbname=
localhost;dbname=testDB',
testDB',
$user, $pass
$pass);
);
?>
10
GESTION DES ERREURS
11
Gestion des erreurs de connexion
12
Gestion des erreurs de connexion
<?php
try {
$dbh = new PDOPDO(('mysql:host=h;dbname=db
mysql:host=h;dbname=db', ',
$user
user, , $pass
pass)) ;
…
$dbh = null ;
}
catch (PDOException $e) {
echo "Erreur: ".$e .$e->getMessage
getMessage() ().."<br/>
<br/>" " ;
die()
die() ;
}
?> die () est un alias de exit : c'est une fonction native
de PHP qui permet de stopper l'exécution du script. Si
une chaîne de caractères est passée en argument, elle
est affichée avant l'arrêt.
13
EFFECTUER UNE REQUÊTE
14
Exécution d'une requête
<?
<?php
php
try {
$pdo = new PDO
PDO(
("mysql:host
mysql:host=
=localhost"
localhost") ;
$pdostat = $pdo
pdo-
->query
query(
("SELECT * FROM clients"
clients") ;
}
catch (Exception $e) {
echo "ERREUR : ".$
.$e
e->getMessage
getMessage()
() ;
}
15
Exploitation des résultats d'une requête
Récupération des données d'une ligne
public PDOStatement::fetch(mode)
Récupère une ligne depuis un jeu de résultats associé à
l'objet PDOStatement. Le paramètre mode détermine la façon dont PDO
retourne la ligne.
20
Préparation d'une requête
PDOStatement PDO::
PDO::prepare
prepare((string statement [,
driver_options])
array driver_options])
statement : la requête à préparer. Peut contenir des
paramètres anonymes (? (?) ou nommés (:nom
(: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
$pdo
pdo=
=new PDO
PDO(
("mysql:host
mysql:host=
=localhost;dbname=
localhost;dbname=mysql
mysql"
") ;
$pdostat = $pdo
pdo-
->prepare
prepare(
(
"SELECT * FROM user WHERE User= ?"
?") ;
22
Association des paramètres d'une requête
bool PDOStatement
PDOStatement:: ::bindValue
bindValue((mixed parameter,
parameter,
mixed value [, int data_type ])
data_type])
parameter : le paramètre (nom ou position [1…n])
value : sa valeur
Associe une valeur
data_type : le type de la valeur à un paramètre
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
PDOStatement::
::execute
execute([
([array
array parameters ])
parameters])
parameters : tableau associatif ou indexé des valeurs
23
Préparation puis exécution d'une requête (1)
$pdo
pdo=
=new PDO
PDO(
("mysql:host
mysql:host==localhost;dbname=
localhost;dbname=mysql
mysql"") ;
$pdo
pdo-
->setAttribute
setAttribute(
(PDO
PDO::
::ATTR_ERRMODE,
ATTR_ERRMODE,
PDO::
PDO::ERRMODE_EXCEPTION
ERRMODE_EXCEPTION));
$pdostat = $pdo
pdo-
->prepare
prepare((
"SELECT * FROM user WHERE User= ?" ?") ;
$pdostat
pdostat-
->bindValue
bindValue(
(1, 'root
'root'
') ;
$pdostat
pdostat-
->execute
execute()
() ; paramètre anonyme
// Utilisation du résultat
$pdostat
pdostat-
->bindValue
bindValue(
(1, ‘admin
‘admin'
') ;
$pdostat
pdostat-
->execute
execute()
() ;
// Utilisation du résultat
25
Intérêt des requêtes préparées
26
ATTAQUE PAR INJECTION
SQL
27
Attaque par injection SQL ?
28
Exemple concret d'injection SQL (1)
$pdo = new PDO
PDO(
('mysql:host
mysql:host=
=localhost;dbname=test
localhost;dbname=test'
') ;
$pdostat = $pdo
pdo-
->query
query(
( SELECT *
FROM membre
WHERE login='
login='{
{$_GET[
_GET['
'login
login'
']}
]}'
'
AND passwd
passwd='
='{
{$_GET[
_GET['
'passwd
passwd'
']}
]}'
' ) ;
echo "Requête:
Requête:\
\n$req
req\
\n" ;
if ($utilisateur = $pdostat
pdostat-
->fetch
fetch())
())
echo "Bienvenue {$utilisateur
utilisateur[
['nom
nom'
']}
]}"
" ;
else
echo "Désolé...
Désolé..."
" ;
29
Exemple concret d'injection SQL (2)
Requête:
SELECT *
FROM membre
WHERE login='whatever
login='whatever''
AND passwd='who_cares?
passwd='who_cares ?'
Désolé...
30
Exemple concret d'injection SQL (3)
Saisie de l'utilisateur :
mail : whatever
pass : who_cares
who_cares?'
?' OR true
true!='
!='
URL :
?mail=whatever
?mail=whatever&&passwd
passwd=
=who_cares
who_cares?'%20OR%20true!='
?'%20OR%20true!='
Requête:
SELECT *
FROM membre
WHERE login='whatever
login='whatever''
AND passwd='who_cares?'
passwd='who_cares ?' OR true!='
true!='''
Bienvenue John
31
Protection contre les injections SQL (1)
$pdo = new PDO
PDO(
('mysql:host
mysql:host==localhost;dbname=test
localhost;dbname=test'') ;
$pdostat = $pdo
pdo-
->prepare
prepare(($req = <<<
<<<SQL
SQL
SELECT *
FROM membre
WHERE login=?
AND passwd
passwd=?
=?
SQL
) ;
$pdostat
pdostat-
->execute
execute((array
array(
($_GET[
_GET[''login
login'
'],
$_GET[
_GET['
'passwd
passwd'
'])) ;
if ($utilisateur = $pdostat
pdostat-
->fetch
fetch())
())
{ echo "Bienvenue {$utilisateur
utilisateur[['nom
nom'
']}
]}\
\n" ; }
else { echo "Désole...
Désole...\\n" ; }
32
Protection contre les injections SQL (2)
$pdo = new PDO
PDO(
('mysql:host
mysql:host= =localhost;dbname=test
localhost;dbname=test' ') ;
$login = $pdo
pdo-
->quote
quote(($_GET[
_GET[' 'login
login'']) ;
$passwd = $pdo
pdo-
->quote
quote(($_GET[
_GET[' 'passwd
passwd'']) ;
$pdostat = $pdo
pdo-
->query
query(($req = <<<<<<SQL
SQL
SELECT *
FROM membre
WHERE login=
login=$$login
AND passwd
passwd==$passwd
SQL
) ;
Requête:
SELECT
echo *
"Requête:
Requête:\\n$req
req\
\n" ;
if FROM membre
($utilisateur = $pdostat
pdostat- ->fetch
fetch())
())
WHERE login='whatever
login='whatever''
{ echo
AND "Bienvenue
passwd='
passwd='who_cares {?$
who_cares? utilisateur[
utilisateur
\' OR true!=
true!=\\'[''nom
nom'
']}
]}\
\n" ; }
Désolé...
else { echo "Désole...
Désole...\ \n" ; }
33