Contenu connexe Similaire à Formation php pdo (20) Formation php pdo1. Programmation Web 2015Programmation Web 2015 11
PHP PDOPHP PDO
Les BasesLes Bases
Souhaibou SallaSouhaibou Salla
Souhaibou36@yahoo.frSouhaibou36@yahoo.fr
Développeur PHP & MySQLDéveloppeur PHP & MySQL
: :// . .Site http www alphorm com
: :// . .Blog http blog alphorm com
: :// . .Forum http forum alphorm com
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
2. Programmation Web 2015Programmation Web 2015 22
PLANPLAN
• Présentation du formateurPrésentation du formateur
• Publics concernésPublics concernés
• Connaissances requisesConnaissances requises
• Qu’est ce que PDOQu’est ce que PDO
• Pourquoi PDOPourquoi PDO
• Plan de formationPlan de formation
• Liens des ressources utilesLiens des ressources utiles
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
3. Programmation Web 2015Programmation Web 2015 33
Qui suis-jeQui suis-je
•Souhaibou SallaSouhaibou Salla
•Développeur PHP MySQL (4 ans)Développeur PHP MySQL (4 ans)
•Responsable Informatique dans uneResponsable Informatique dans une
société & Développeur freelancesociété & Développeur freelance
•Mes référencesMes références
•LinkedIn :LinkedIn :
•Alphorm :Alphorm :
•Me contacterMe contacter
•souhaibou36@yahoo.frsouhaibou36@yahoo.fr
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
4. Programmation Web 2015Programmation Web 2015 44
Publics ConcernésPublics Concernés
•Développeur PHPDéveloppeur PHP
•PassionnésPassionnés
•Administrateur base de donnéesAdministrateur base de données
•Les curieuxLes curieux
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
5. Connaissances requisesConnaissances requises
Maitrisez PHP + 1base de donnéesMaitrisez PHP + 1base de données
Maitrisez la programmation orienté objet en PHPMaitrisez la programmation orienté objet en PHP
55Programmation Web 2013-2014Programmation Web 2013-2014
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
6. 66Programmation Web 2015Programmation Web 2015
PDOPDO
PDO :PDO : PPHPHP DDataata OObjectsbjects
Extension PHP fournissant une interface pourExtension PHP fournissant une interface pour
accéder à une base de donnéesaccéder à une base de données
Fournit une interface d'Fournit une interface d'abstraction pour l'accèsabstraction pour l'accès
aux donnéesaux données
Ne fournitNe fournit PASPAS uneune abstraction de base deabstraction de base de
donnéesdonnées
SQL spécifique au moteurSQL spécifique au moteur
Fonctionnalités présentes / absentesFonctionnalités présentes / absentes
Interface orientée objetInterface orientée objet
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
7. Bases de données supportéesBases de données supportées
Nom du driverNom du driver Bases de données supportéesBases de données supportées
PDO_DBLIBPDO_DBLIB FreeTDS / Microsoft SQL Server / SybaseFreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRDPDO_FIREBIRD Firebird/Interbase 6Firebird/Interbase 6
PDO_IBMPDO_IBM IBM DB2IBM DB2
PDO_INFORMIXPDO_INFORMIX IBM Informix Dynamic ServerIBM Informix Dynamic Server
PDO_MYSQLPDO_MYSQL MySQL 3.x/4.x/5.xMySQL 3.x/4.x/5.x
PDO_OCIPDO_OCI Oracle Call InterfaceOracle Call Interface
PDO_ODBCPDO_ODBC ODBC v3 (IBM DB2, unixODBC et win32 ODBC)ODBC v3 (IBM DB2, unixODBC et win32 ODBC)
PDO_PGSQLPDO_PGSQL PostgreSQLPostgreSQL
PDO_SQLITEPDO_SQLITE SQLite 3 et SQLite 2SQLite 3 et SQLite 2
PDO_4DPDO_4D 4D4D
77Programmation Web 2015Programmation Web 2015
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
8. 88Programmation Web 2015Programmation Web 2015
Classes prédéfiniesClasses prédéfinies
PDOPDO ::
connexion PHP / base de donnéesconnexion PHP / base de données
__construct()__construct()
exec(), prepare(), query()exec(), prepare(), query()
errorCode(), errorInfo()errorCode(), errorInfo()
getAttributes(), setAttribute()getAttributes(), setAttribute()
lastInsertId(), quote()lastInsertId(), quote()
beginTransaction()beginTransaction()
commit(), rollBack()commit(), rollBack()
getAvailableDrivers()getAvailableDrivers()
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
9. 99Programmation Web 2015Programmation Web 2015
Classes prédéfiniesClasses prédéfinies
PDOStatementPDOStatement ::
requête préparée, jeu de résultatsrequête préparée, jeu de résultats
bindColumn(), bindParam(), bindValue(),bindColumn(), bindParam(), bindValue(),
closeCursor()closeCursor()
errorCode(), errorInfo()errorCode(), errorInfo()
fetch(), fetchAll(), fetchColumn(), fetchObject(),fetch(), fetchAll(), fetchColumn(), fetchObject(),
setFetchMode(), nextRowset()setFetchMode(), nextRowset()
rowCount(), columnCount(), getColumnMeta()rowCount(), columnCount(), getColumnMeta()
getAttribute(), setAttribute()getAttribute(), setAttribute()
execute()execute()
debugDumpParams()debugDumpParams()
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
10. 1010Programmation Web 2015Programmation Web 2015
Connexions et gestionnaire de connexionConnexions et gestionnaire de connexion
Instanciation d'un objetInstanciation d'un objet PDOPDO
$dbh=new$dbh=new PDOPDO((DSNDSN [,[, useruser [,[, passpass [,[, optionsoptions]]]);]]]);
DSNDSN :: DDataata SSourceource NNameame
nom_du_driver:syntaxe_spécifique_au_drivernom_du_driver:syntaxe_spécifique_au_driver
Ex :Ex : mysql:host=localhost;dbname=ma_basemysql:host=localhost;dbname=ma_base
useruser : nom d'utilisateur,: nom d'utilisateur, passpass : mot de passe: mot de passe
optionsoptions : tableau associatif: tableau associatif
spécifiques au driverspécifiques au driver
Ex : array(PDO::ATTR_PERSISTENT => true)) ;Ex : array(PDO::ATTR_PERSISTENT => true)) ;
Fin de connexion : $dbh=null ; ou unset($dbh) ;Fin de connexion : $dbh=null ; ou unset($dbh) ;
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
11. 1111Programmation Web 2015Programmation Web 2015
Gestion des erreurs de connexionGestion des erreurs de connexion
Connexion par construction d'un objetConnexion par construction d'un objet
Gestion envisageable des erreursGestion envisageable des erreurs
AucuneAucune
Fin brutale (exit, die)Fin brutale (exit, die)
ÉtatÉtat
ExceptionException
En cas d'erreur de connexionEn cas d'erreur de connexion
ObjetObjet PDOExceptionPDOException lancélancé
PDOExceptionPDOException hérite de Exceptionhérite de Exception
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
12. 1212Programmation Web 2015Programmation Web 2015
Gestion des erreurs de connexionGestion des erreurs de connexion
<?php<?php
trytry {{
$$dbhdbh == newnew PDOPDO((''mysql:host=h;dbname=dbmysql:host=h;dbname=db',',
$$useruser,, $$passpass)) ;;
……
$$dbhdbh == nullnull ;;
}}
catchcatch ((PDOExceptionPDOException $$ee)) {{
echoecho ""Erreur:Erreur: "".$.$ee->->getMessagegetMessage()()..""<br/><br/>"" ;;
diedie()() ;;
}}
?>?>
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
13. 1313Programmation Web 2015Programmation Web 2015
Gestion des erreurs (hormis connexion)Gestion des erreurs (hormis connexion)
PDO::ERRMODE_SILENTPDO::ERRMODE_SILENT ((par défautpar défaut))
ModeMode silencieuxsilencieux, mise en place d'un, mise en place d'un code d'erreurcode d'erreur
PDO :PDO : errorCodeerrorCode() /() / errorInfoerrorInfo()()
PDOStatement :PDOStatement : errorCodeerrorCode() /() / errorInfoerrorInfo()()
PDO::ERRMODE_WARNINGPDO::ERRMODE_WARNING
Mise en place duMise en place du code d'erreurcode d'erreur
Émission d'une erreur de typeÉmission d'une erreur de type E_WARNINGE_WARNING
PDO::ERRMODE_EXCEPTIONPDO::ERRMODE_EXCEPTION
Mise en place duMise en place du code d'erreurcode d'erreur
ObjetObjet PDOExceptionPDOException lancélancé
14. 1414Programmation Web 2015Programmation Web 2015
Gestion des erreurs (hormis connexion)Gestion des erreurs (hormis connexion)
<?php<?php
trytry {{
$$dbhdbh == newnew PDOPDO((''mysql:host=h;dbname=dbmysql:host=h;dbname=db',',
$$useruser,, $$passpass)) ;;
$$dbhdbh->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
……
$$dbhdbh == nullnull ;;
}}
catchcatch ((PDOExceptionPDOException $$ee)) {{
echoecho ""Erreur:Erreur: "".$.$ee->->getMessagegetMessage()()..""<br/><br/>"" ;;
diedie()() ;;
}}
?>?>
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
15. 1515Programmation Web 2015Programmation Web 2015
Gestion des erreurs : code d'erreurGestion des erreurs : code d'erreur
<?php<?php
$$pdopdo == newnew PDOPDO((""mysql:host=localhostmysql:host=localhost"")) ;;
$$pdostatpdostat == $$pdopdo->->queryquery((""COUCOUCOUCOU"")) ;;
ifif (($$pdopdo->->errorCodeerrorCode())()) {{
echoecho ""ERREUR !!ERREUR !!nn"" ;;
echoecho ""<pre><pre>nn"" ;;
var_dumpvar_dump(($$pdopdo->->errorInfoerrorInfo())()) ;;
echoecho ""</pre></pre>nn"" ;;
}}
?>?>ERREUR !!ERREUR !!
array(3) {array(3) {
[0]=> string(5) "42000"[0]=> string(5) "42000"
[1]=> int(1064)[1]=> int(1064)
[2]=> string(47) "Erreur de syntaxe près de 'COUCOU' à la ligne 1"[2]=> string(47) "Erreur de syntaxe près de 'COUCOU' à la ligne 1"
}}
Code SQLSTATECode SQLSTATE
Code erreur spécifiqueCode erreur spécifique
du driverdu driver
Chaîne erreurChaîne erreur
spécifique au driverspécifique au driver
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
16. 1616Programmation Web 2015Programmation Web 2015
Gestion des erreurs : exceptionsGestion des erreurs : exceptions
<?php<?php
trytry {{
$$pdopdo == newnew PDOPDO((""mysql:host=localhostmysql:host=localhost"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION)) ;;
$$pdostatpdostat == $$pdopdo->->queryquery((""COUCOUCOUCOU"")) ;;
}}
catchcatch ((ExceptionException $$ee)) {{
echoecho ""ERREUR :ERREUR : "".$.$ee->->getMessagegetMessage()() ;;
}}
?>?>
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064
Erreur de syntaxe près de 'COUCOU' à la ligne 1Erreur de syntaxe près de 'COUCOU' à la ligne 1
Code SQLSTATECode SQLSTATE
Code erreur spécifiqueCode erreur spécifique
du driverdu driver
Chaîne erreurChaîne erreur
spécifique au driverspécifique au driver
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
17. 1717Programmation Web 2015Programmation Web 2015
Exécution d'une requêteExécution d'une requête
PDOStatementPDOStatement PDO::queryPDO::query (( stringstring statementstatement ))
<?php<?php
trytry {{
$$pdopdo == newnew PDOPDO((""mysql:host=localhostmysql:host=localhost"")) ;;
$$pdostatpdostat == $$pdopdo->->queryquery((""SELECT * FROM clientsSELECT * FROM clients"")) ;;
}}
catchcatch ((ExceptionException $$ee)) {{
echoecho ""ERREUR :ERREUR : "".$.$ee->->getMessagegetMessage()() ;;
}}
?>?>
RequêteRequêteRésultat de requêteRésultat de requête
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
18. 1818Programmation Web 2015Programmation Web 2015
Exploitation des résultats d'une requêteExploitation des résultats d'une requête
Récupération des données ligne à ligneRécupération des données ligne à ligne
Une ligne peut être :Une ligne peut être :
un tableau indexéun tableau indexé
un tableau associatifun tableau associatif
un tableau mixte (par défaut)un tableau mixte (par défaut)
un objet anonymeun objet anonyme
un objet d'une classe définie par l'utilisateurun objet d'une classe définie par l'utilisateur
Récupération des données d'une colonneRécupération des données d'une colonne
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
19. 1919Programmation Web 2015Programmation Web 2015
Exploitation des résultats d'une requête (1)Exploitation des résultats d'une requête (1)
trytry {{
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->queryquery((""SELECT * FROM userSELECT * FROM user"")) ;;
$$pdostatpdostat->->setFetchModesetFetchMode((PDOPDO::::FETCH_ASSOCFETCH_ASSOC)) ;;
foreachforeach (($$pdostatpdostat asas $$ligneligne)) {{
echoecho implodeimplode(('';;',', $$ligneligne))..""<br><br>nn"" ;;
}}
}}
catchcatch ((ExceptionException $$ee)) {{
echoecho ""ERREUR :ERREUR : "".$.$ee->->getMessagegetMessage()() ;;
}}
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
20. 2020Programmation Web 2015Programmation Web 2015
Exploitation des résultats d'une requête (2)Exploitation des résultats d'une requête (2)
trytry {{
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->queryquery((""SELECT * FROM userSELECT * FROM user"")) ;;
foreachforeach (($$pdostatpdostat->->fetchAllfetchAll((PDOPDO::::FETCH_ASSOCFETCH_ASSOC))
asas $$ligneligne)) {{
echoecho implodeimplode(('';;',', $$ligneligne))..""<br><br>nn"" ;;
}}
}}
catchcatch ((ExceptionException $$ee)) {{
echoecho ""ERREUR :ERREUR : "".$.$ee->->getMessagegetMessage()() ;;
}}
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
21. 2121Programmation Web 2015Programmation Web 2015
Exploitation des résultats d'une requête (3)Exploitation des résultats d'une requête (3)
trytry {{
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->queryquery((""SELECT * FROM userSELECT * FROM user"")) ;;
whilewhile (($$ligneligne
= $= $pdostatpdostat->->fetchfetch((PDOPDO::::FETCH_ASSOCFETCH_ASSOC)))) {{
echoecho implodeimplode(('';;',', $$ligneligne))..""<br><br>nn"" ;;
}}
}}
catchcatch ((ExceptionException $$ee)) {{
echoecho ""ERREUR :ERREUR : "".$.$ee->->getMessagegetMessage()() ;;
}}
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
22. 2222Programmation Web 2015Programmation Web 2015
Modes de récupération des données (1)Modes de récupération des données (1)
PDO::FETCH_ASSOCPDO::FETCH_ASSOC
retourner chaque ligne dans unretourner chaque ligne dans un tableau indexé par lestableau indexé par les
noms des colonnesnoms des colonnes comme elles sont retournéescomme elles sont retournées
dans le jeu de résultats correspondant. Si le jeu dedans le jeu de résultats correspondant. Si le jeu de
résultats contientrésultats contient de multiples colonnes avec lede multiples colonnes avec le
même nommême nom, PDO::FETCH_ASSOC retourne, PDO::FETCH_ASSOC retourne uneune
seule valeur par nom de colonneseule valeur par nom de colonne..
PDO::FETCH_NUMPDO::FETCH_NUM
retournerretourner chaque lignechaque ligne dans undans un tableau indexé par letableau indexé par le
numéro des colonnesnuméro des colonnes comme elles sont retournéescomme elles sont retournées
dans le jeu de résultats correspondant, endans le jeu de résultats correspondant, en
commençant à 0commençant à 0..
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
23. 2323Programmation Web 2015Programmation Web 2015
Modes de récupération des données (2)Modes de récupération des données (2)
PDO::FETCH_BOTHPDO::FETCH_BOTH
retournerretourner chaque lignechaque ligne dans undans un tableau indexé par lestableau indexé par les
noms des colonnesnoms des colonnes ainsi que leurs numérosainsi que leurs numéros, comme, comme
elles sont retournées dans le jeu de résultatselles sont retournées dans le jeu de résultats
correspondant, encorrespondant, en commençant à 0commençant à 0..
PDO::FETCH_OBJPDO::FETCH_OBJ
retournerretourner chaque lignechaque ligne dans undans un objet avec les nomsobjet avec les noms
de propriétés correspondant aux noms des colonnesde propriétés correspondant aux noms des colonnes
comme elles sont retournées dans le jeu de résultats.comme elles sont retournées dans le jeu de résultats.
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
24. 2424Programmation Web 2015Programmation Web 2015
Modes de récupération des données (3)Modes de récupération des données (3)
PDO::FETCH_BOUNDPDO::FETCH_BOUND
retournerretourner truetrue etet assigner les valeursassigner les valeurs des colonnesdes colonnes
du jeu de résultatsdu jeu de résultats dans les variables PHP auxquellesdans les variables PHP auxquelles
elles sont liéeselles sont liées avec la méthodeavec la méthode
PDOStatement::bindParam()PDOStatement::bindParam() ou la méthodeou la méthode
PDOStatement::bindColumn()PDOStatement::bindColumn()..
PDO::FETCH_CLASS |PDO::FETCH_CLASS |
PDO::FETCH_CLASSTYPEPDO::FETCH_CLASSTYPE
retourner une nouvelleretourner une nouvelle instance de la classeinstance de la classe
demandéedemandée, liant les colonnes aux propriétés, liant les colonnes aux propriétés
nommées dans la classe.nommées dans la classe.
Nom de la classe = 1ère colonneNom de la classe = 1ère colonne..
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
25. 2525Programmation Web 2015Programmation Web 2015
Modes de récupération des données (4)Modes de récupération des données (4)
PDO::FETCH_INTOPDO::FETCH_INTO
met à jour une instance existantemet à jour une instance existante de la classede la classe
demandée, liant lesdemandée, liant les colonnes du jeu de résultatscolonnes du jeu de résultats auxaux
noms desnoms des propriétés de la classepropriétés de la classe..
PDO::FETCH_LAZYPDO::FETCH_LAZY
retournerretourner chaque lignechaque ligne en tanten tant qu'objet avec les nomsqu'objet avec les noms
des attributs correspondant aux noms des colonnesdes attributs correspondant aux noms des colonnes
retournées dans le jeu de résultats.retournées dans le jeu de résultats.
PDO::FETCH_LAZY crée lesPDO::FETCH_LAZY crée les noms des attributs denoms des attributs de
l'objet comme ils sont rencontrésl'objet comme ils sont rencontrés..
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
26. 2626Programmation Web 2015Programmation Web 2015
Préparation d'une requêtePréparation d'une requête
DéroulementDéroulement d'une requête SQLd'une requête SQL
1.1. AnalyseAnalyse
2.2. CompilationCompilation
3.3. OptimisationOptimisation
4.4. ExécutionExécution
Exécution répétéeExécution répétée d'une requête :d'une requête : 11++22++33++44
PréparationPréparation d'une requête :d'une requête : 11++22++33
Exécution répétéeExécution répétée d'uned'une requête préparéerequête préparée :: 44
Préparation en fonction de paramètres :Préparation en fonction de paramètres :
AnonymesAnonymes
NommésNommés
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
27. 2727Programmation Web 2015Programmation Web 2015
Préparation d'une requêtePréparation d'une requête
PDOStatementPDOStatement PDO::preparePDO::prepare((stringstring statementstatement [,[,
arrayarray driver_optionsdriver_options])])
statementstatement : la requête à préparer. Peut contenir des: la requête à préparer. Peut contenir des
paramètres anonymes (paramètres anonymes (??) ou nommés () ou nommés (:nom:nom))
driver_optionsdriver_options : tableau d'options du driver: tableau d'options du driver
retourne un objetretourne un objet PDOStatementPDOStatement qui effectueraqui effectuera
l'association des paramètres et exécutera la requêtel'association des paramètres et exécutera la requête
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdostatpdostat == $$pdopdo->->prepareprepare((
""SELECT * FROM user WHERE User= ?SELECT * FROM user WHERE User= ?"")) ;;
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
28. 2828Programmation Web 2015Programmation Web 2015
Association des paramètres d'une requêteAssociation des paramètres d'une requête
boolbool PDOStatement::bindValuePDOStatement::bindValue((mixed parametermixed parameter,,
mixed valuemixed value [,[, int data_typeint data_type])])
parameterparameter : le paramètre (nom ou position [1…n]): le paramètre (nom ou position [1…n])
valuevalue : sa valeur: sa valeur
data_typedata_type : le type de la valeur: le type de la valeur
PDO::PARAM_BOOLPDO::PARAM_BOOL booléen.booléen.
PDO::PARAM_NULLPDO::PARAM_NULL NULL SQL.NULL SQL.
PDO::PARAM_INTPDO::PARAM_INT INTEGER SQL.INTEGER SQL.
PDO::PARAM_STRPDO::PARAM_STR CHAR, VARCHAR ou autre chaîne.CHAR, VARCHAR ou autre chaîne.
PDO::PARAM_LOBPDO::PARAM_LOB "objet large" SQL."objet large" SQL.
boolbool PDOStatement::executePDOStatement::execute([([array parametersarray parameters])])
parametersparameters : tableau associatif ou indexé des valeurs: tableau associatif ou indexé des valeurs
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
29. 2929Programmation Web 2015Programmation Web 2015
Préparation puis exécution d'une requête (1)Préparation puis exécution d'une requête (1)
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->prepareprepare((
""SELECT * FROM user WHERE User= ?SELECT * FROM user WHERE User= ?"")) ;;
$$pdostatpdostat->->bindValuebindValue((11, ', 'rootroot'')) ;;
$$pdostatpdostat->->executeexecute()() ;;
// Utilisation du résultat// Utilisation du résultat
$$pdostatpdostat->->bindValuebindValue((11, ', 'cutronacutrona'')) ;;
$$pdostatpdostat->->executeexecute()() ;;
// Utilisation du résultat// Utilisation du résultat
Préparation de la requêtePréparation de la requêteAssociation d'une valeur au 1Association d'une valeur au 1erer
paramètreparamètreExécution de la requêteExécution de la requêteAssociation d'une valeur au 1er paramètreAssociation d'une valeur au 1er paramètreExécution de la requêteExécution de la requête
paramètre anonymeparamètre anonyme
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
30. 3030Programmation Web 2015Programmation Web 2015
Préparation puis exécution d'une requête (2)Préparation puis exécution d'une requête (2)
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->prepareprepare((
""SELECT * FROM user WHERE User= :utilisateurSELECT * FROM user WHERE User= :utilisateur"")) ;;
$$pdostatpdostat->->bindValuebindValue(('':utilisateur:utilisateur', '', 'rootroot'')) ;;
$$pdostatpdostat->->executeexecute()() ;;
// Utilisation du résultat// Utilisation du résultat
$$pdostatpdostat->->bindValuebindValue(('':utilisateur:utilisateur', '', 'cutronacutrona'')) ;;
$$pdostatpdostat->->executeexecute()() ;;
// Utilisation du résultat// Utilisation du résultat
Préparation de la requêtePréparation de la requêteAssociation d'une valeur au paramètre nomméAssociation d'une valeur au paramètre nomméExécution de la requêteExécution de la requêteAssociation d'une valeur au paramètre nomméAssociation d'une valeur au paramètre nomméExécution de la requêteExécution de la requête
paramètre nomméparamètre nommé
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
31. 3131Programmation Web 2015Programmation Web 2015
Préparation puis exécution d'une requête (3)Préparation puis exécution d'une requête (3)
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->prepareprepare((
""SELECT * FROM user WHERE User= ?SELECT * FROM user WHERE User= ?"")) ;;
$$pdostatpdostat->->executeexecute((arrayarray((''rootroot'')))) ;;
// Utilisation du résultat// Utilisation du résultat
$$pdostatpdostat->->executeexecute((arrayarray((''cutronacutrona'')))) ;;
// Utilisation du résultat// Utilisation du résultat
Préparation de la requêtePréparation de la requêteAssociation d'une valeur au 1Association d'une valeur au 1erer
paramètreparamètreExécution de la requêteExécution de la requêteAssociation d'une valeur au 1er paramètreAssociation d'une valeur au 1er paramètreExécution de la requêteExécution de la requête
paramètre anonymeparamètre anonyme
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
32. 3232Programmation Web 2015Programmation Web 2015
Préparation puis exécution d'une requête (4)Préparation puis exécution d'une requête (4)
$$pdopdo==newnew PDOPDO((""mysql:host=localhost;dbname=mysqlmysql:host=localhost;dbname=mysql"")) ;;
$$pdopdo->->setAttributesetAttribute((PDOPDO::::ATTR_ERRMODE,ATTR_ERRMODE,
PDOPDO::::ERRMODE_EXCEPTIONERRMODE_EXCEPTION));;
$$pdostatpdostat == $$pdopdo->->prepareprepare((
""SELECT * FROM user WHERE User= :utilisateurSELECT * FROM user WHERE User= :utilisateur"")) ;;
$$pdostatpdostat->->executeexecute((
arrayarray(('':utilisateur:utilisateur'' =>=> ''rootroot'')))) ;;
// Utilisation du résultat// Utilisation du résultat
$$pdostatpdostat->->executeexecute((
arrayarray(('':utilisateur:utilisateur'' =>=> ''cutronacutrona'')))) ;;
// Utilisation du résultat// Utilisation du résultat
Préparation de la requêtePréparation de la requêteAssociation d'une valeur au paramètre nomméAssociation d'une valeur au paramètre nomméExécution de la requêteExécution de la requêteAssociation d'une valeur au paramètre nomméAssociation d'une valeur au paramètre nomméExécution de la requêteExécution de la requête
paramètre nomméparamètre nommé
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
33. 3333Programmation Web 2015Programmation Web 2015
Intérêt des requêtes préparéesIntérêt des requêtes préparées
Amélioration des performances en casAmélioration des performances en cas
d'exécutions répétéesd'exécutions répétées
Émulation faite par PDO si le driver ne lesÉmulation faite par PDO si le driver ne les
supporte pas nativementsupporte pas nativement
Protection automatique des valeurs desProtection automatique des valeurs des
paramètres pourparamètres pour interdire les attaques parinterdire les attaques par
injection de code SQLinjection de code SQL
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
34. 3434Programmation Web 2015Programmation Web 2015
Attaque par injection SQL ?Attaque par injection SQL ?
Ex : validation d'un login/pass sur un siteEx : validation d'un login/pass sur un site
Requête consistant à trouver un enregistrementRequête consistant à trouver un enregistrement
correspondant au couple login/pass fourni parcorrespondant au couple login/pass fourni par
l'utilisateurl'utilisateur
SELECTSELECT **
FROMFROM membremembre
WHEREWHERE mail='mail='{{$$_GET[_GET[''mailmail'']}]}''
ANDAND passwd='passwd='{{$$_GET[_GET[''passwdpasswd'']}]}''
Et si on essayait de fournir un mot de passe unEt si on essayait de fournir un mot de passe un
peu particulier…peu particulier…
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
35. 3535Programmation Web 2015Programmation Web 2015
Exemple concret d'injection SQL (1)Exemple concret d'injection SQL (1)
$$pdopdo == newnew PDOPDO((''mysql:host=localhost;dbname=testmysql:host=localhost;dbname=test'')) ;;
$$pdostatpdostat == $$pdopdo->->queryquery(($$reqreq == <<<<<<SQLSQL
SELECTSELECT **
FROMFROM membremembre
WHEREWHERE mail='mail='{{$$_GET[_GET[''mailmail'']}]}''
ANDAND passwd='passwd='{{$$_GET[_GET[''passwdpasswd'']}]}''
SQLSQL
)) ;;
echoecho ""Requête:Requête:nn$$reqreqnn"" ;;
ifif (($$utilisateurutilisateur == $$pdostatpdostat->->fetchfetch())())
echoecho ""BienvenueBienvenue {{$$utilisateurutilisateur[[''nomnom'']}]}"" ;;
elseelse
echoecho ""Désolé...Désolé..."" ;;
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
36. 3636Programmation Web 2015Programmation Web 2015
Exemple concret d'injection SQL (2)Exemple concret d'injection SQL (2)
Saisie de l'utilisateur :Saisie de l'utilisateur :
mail :mail : whateverwhatever
pass :pass : who_cares?who_cares?
URL :URL :
?mail=whatever&passwd=who_cares??mail=whatever&passwd=who_cares?
Requête:Requête:
SELECT *SELECT *
FROM membreFROM membre
WHERE mail='WHERE mail='whateverwhatever''
AND passwd='AND passwd='who_cares?who_cares?''
Désolé...Désolé...
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
37. 3737Programmation Web 2015Programmation Web 2015
Exemple concret d'injection SQL (3)Exemple concret d'injection SQL (3)
Saisie de l'utilisateur :Saisie de l'utilisateur :
mail :mail : whateverwhatever
pass :pass : who_cares?' OR true!='who_cares?' OR true!='
URL :URL :
?mail=whatever&passwd=who_cares?'%20OR%20true!='?mail=whatever&passwd=who_cares?'%20OR%20true!='
Requête:Requête:
SELECT *SELECT *
FROM membreFROM membre
WHERE mail='WHERE mail='whateverwhatever''
AND passwd='AND passwd='who_cares?' OR true!='who_cares?' OR true!='''
Bienvenue JohnBienvenue John
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
38. 3838Programmation Web 2015Programmation Web 2015
Protection contre les injections SQL (1)Protection contre les injections SQL (1)
$$pdopdo == newnew PDOPDO((''mysql:host=localhost;dbname=testmysql:host=localhost;dbname=test'')) ;;
$$pdostatpdostat == $$pdopdo->->prepareprepare(($$reqreq == <<<<<<SQLSQL
SELECTSELECT **
FROMFROM membremembre
WHEREWHERE mail=?mail=?
ANDAND passwd=?passwd=?
SQLSQL
)) ;;
$$pdostatpdostat->->executeexecute((arrayarray(($$_GET[_GET[''mailmail'']],,
$$_GET[_GET[''passwdpasswd'']))])) ;;
ifif (($$utilisateurutilisateur == $$pdostatpdostat->->fetchfetch())())
{{ echoecho ""BienvenueBienvenue {{$$utilisateurutilisateur[[''nomnom'']}n]}n"" ;; }}
elseelse {{ echoecho ""Désole...Désole...nn"" ;; }}
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
39. 3939Programmation Web 2015Programmation Web 2015
Protection contre les injections SQL (2)Protection contre les injections SQL (2)
$$pdopdo == newnew PDOPDO((''mysql:host=localhost;dbname=testmysql:host=localhost;dbname=test'')) ;;
$$mailmail == $$pdopdo->->quotequote(($$_GET[_GET[''mailmail''])]) ;;
$$passwdpasswd == $$pdopdo->->quotequote(($$_GET[_GET[''passwdpasswd''])]) ;;
$$pdostatpdostat == $$pdopdo->->queryquery(($$reqreq == <<<<<<SQLSQL
SELECTSELECT **
FROMFROM membremembre
WHEREWHERE mail=mail=$$mailmail
ANDAND passwd=passwd=$$passwdpasswd
SQLSQL
)) ;;
echoecho ""Requête:Requête:nn$$reqreqnn"" ;;
ifif (($$utilisateurutilisateur == $$pdostatpdostat->->fetchfetch())())
{{ echoecho ""BienvenueBienvenue {{$$utilisateurutilisateur[[''nomnom'']}n]}n"" ;; }}
elseelse {{ echoecho ""Désole...Désole...nn"" ;; }}
Requête:Requête:
SELECT *SELECT *
FROM membreFROM membre
WHERE mail=WHERE mail=''whateverwhatever''
AND passwd=AND passwd=''who_cares?who_cares?' OR true!=' OR true!=''''
Désolé...Désolé...
40. 4040Programmation Web 2015Programmation Web 2015
Protection contre les injections SQL (3)Protection contre les injections SQL (3)
mysql_connectmysql_connect((''localhostlocalhost''));; mysql_select_dbmysql_select_db((''testtest''));;
$$mailmail == mysql_real_escape_stringmysql_real_escape_string(($$_GET[_GET[''mailmail''])]);;
$$passwdpasswd == mysql_real_escape_stringmysql_real_escape_string(($$_GET[_GET[''passwdpasswd''])]);;
$$resres == mysql_querymysql_query(($$reqreq == <<<<<<SQLSQL
SELECTSELECT ** FROMFROM membremembre
WHEREWHERE mail='mail='$$mailmail''
ANDAND passwd='passwd='$$passwdpasswd''
SQLSQL
)) ;;
ifif ((mysql_num_rowsmysql_num_rows(($$resres)) ==== 11 )) {{
$$utilisateurutilisateur == mysql_fetch_assocmysql_fetch_assoc(($$resres)) ;;
echoecho ""BienvenueBienvenue {{$$utilisateurutilisateur[[''nomnom'']}n]}n"" ;;
}}
elseelse {{ echoecho ""Desole...Desole...nn"" ;; }}
Requête:Requête:
SELECT *SELECT *
FROM membreFROM membre
WHERE mail='WHERE mail='whateverwhatever''
AND passwd='AND passwd='who_cares?who_cares?' OR true!=' OR true!=''''
Désolé...Désolé...
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©
41. 4141Programmation Web 2015Programmation Web 2015
TransactionsTransactions
Transactions :Transactions :
Atomicité, Consistance, Isolation et DurabilitéAtomicité, Consistance, Isolation et Durabilité
BEGIN puis COMMIT ou ROLLBACKBEGIN puis COMMIT ou ROLLBACK
Mode PDO par défaut :Mode PDO par défaut :
Chaque requête est validée automatiquementChaque requête est validée automatiquement
PDO::beginTransaction()PDO::beginTransaction()
PDO::commit()PDO::commit()
PDO::rollBack()PDO::rollBack()
Tous les moteurs ne supportent pas lesTous les moteurs ne supportent pas les
transactionstransactions PDOExceptionPDOException
Formation PHP PDOFormation PHP PDO alphorm.comalphorm.com™™ ©©