SlideShare une entreprise Scribd logo
1  sur  41
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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é
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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™™ ©©
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é...
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™™ ©©
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™™ ©©

Contenu connexe

Tendances

Alphorm.com Formation VMware Horizon View 5.2
Alphorm.com Formation VMware Horizon View 5.2Alphorm.com Formation VMware Horizon View 5.2
Alphorm.com Formation VMware Horizon View 5.2Alphorm
 
Alphorm.com Formation les fondamentaux de Matlab 2013 A
Alphorm.com  Formation les fondamentaux de Matlab 2013 AAlphorm.com  Formation les fondamentaux de Matlab 2013 A
Alphorm.com Formation les fondamentaux de Matlab 2013 AAlphorm
 
Alphorm.com-Formation windows 2012 (70-410)
Alphorm.com-Formation windows 2012 (70-410)Alphorm.com-Formation windows 2012 (70-410)
Alphorm.com-Formation windows 2012 (70-410)Alphorm
 
Alphorm.com Formation WordPress 4
Alphorm.com Formation WordPress 4 Alphorm.com Formation WordPress 4
Alphorm.com Formation WordPress 4 Alphorm
 
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...Alphorm
 
Alphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm
 
Alphorm.com Formation Exchange 2016, Configuration Avancée
Alphorm.com Formation Exchange 2016, Configuration AvancéeAlphorm.com Formation Exchange 2016, Configuration Avancée
Alphorm.com Formation Exchange 2016, Configuration AvancéeAlphorm
 
alphorm.com - Formation Programmer en C++
alphorm.com - Formation Programmer en C++alphorm.com - Formation Programmer en C++
alphorm.com - Formation Programmer en C++Alphorm
 
Alphorm.com Formation SharePoint 2016 : Installation et Configuration
 Alphorm.com Formation SharePoint 2016 : Installation et Configuration Alphorm.com Formation SharePoint 2016 : Installation et Configuration
Alphorm.com Formation SharePoint 2016 : Installation et ConfigurationAlphorm
 
alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)Alphorm
 
alphorm.com - Formation Exchange Server 2013 (70-341)
alphorm.com - Formation Exchange Server 2013 (70-341)alphorm.com - Formation Exchange Server 2013 (70-341)
alphorm.com - Formation Exchange Server 2013 (70-341)Alphorm
 
Alphorm.com Formation Apache - Le Guide Complet de l'administrateur
Alphorm.com Formation Apache - Le Guide Complet de l'administrateurAlphorm.com Formation Apache - Le Guide Complet de l'administrateur
Alphorm.com Formation Apache - Le Guide Complet de l'administrateurAlphorm
 
Alphorm.com Formation knockoutJS
Alphorm.com Formation knockoutJSAlphorm.com Formation knockoutJS
Alphorm.com Formation knockoutJSAlphorm
 
Alphorm.com Formation PostgreSQL, la Haute Disponibilité
Alphorm.com Formation PostgreSQL, la Haute DisponibilitéAlphorm.com Formation PostgreSQL, la Haute Disponibilité
Alphorm.com Formation PostgreSQL, la Haute DisponibilitéAlphorm
 
Alphorm.com Support de la Formation Exchange 2016 Installation et Configuration
Alphorm.com Support de la Formation Exchange 2016 Installation et ConfigurationAlphorm.com Support de la Formation Exchange 2016 Installation et Configuration
Alphorm.com Support de la Formation Exchange 2016 Installation et ConfigurationAlphorm
 
NouveautéS De Visual Basic 2010 V2
NouveautéS De Visual Basic 2010 V2NouveautéS De Visual Basic 2010 V2
NouveautéS De Visual Basic 2010 V2Gregory Renard
 
Alphorm.com Formation JavaFX
Alphorm.com Formation JavaFXAlphorm.com Formation JavaFX
Alphorm.com Formation JavaFXAlphorm
 
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architecture
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architectureAlphorm.com Formation Active Directory 2016 : Le Guide complet de l'architecture
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architectureAlphorm
 
alphorm.com - Formation PostgreSQL administration
alphorm.com - Formation PostgreSQL administrationalphorm.com - Formation PostgreSQL administration
alphorm.com - Formation PostgreSQL administrationAlphorm
 
alphorm.com - Formation XenSources
alphorm.com - Formation XenSourcesalphorm.com - Formation XenSources
alphorm.com - Formation XenSourcesAlphorm
 

Tendances (20)

Alphorm.com Formation VMware Horizon View 5.2
Alphorm.com Formation VMware Horizon View 5.2Alphorm.com Formation VMware Horizon View 5.2
Alphorm.com Formation VMware Horizon View 5.2
 
Alphorm.com Formation les fondamentaux de Matlab 2013 A
Alphorm.com  Formation les fondamentaux de Matlab 2013 AAlphorm.com  Formation les fondamentaux de Matlab 2013 A
Alphorm.com Formation les fondamentaux de Matlab 2013 A
 
Alphorm.com-Formation windows 2012 (70-410)
Alphorm.com-Formation windows 2012 (70-410)Alphorm.com-Formation windows 2012 (70-410)
Alphorm.com-Formation windows 2012 (70-410)
 
Alphorm.com Formation WordPress 4
Alphorm.com Formation WordPress 4 Alphorm.com Formation WordPress 4
Alphorm.com Formation WordPress 4
 
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...
alphorm.com - Formation Développez des applications Web avec ASP.NET MVC 4(70...
 
Alphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage Ruby
 
Alphorm.com Formation Exchange 2016, Configuration Avancée
Alphorm.com Formation Exchange 2016, Configuration AvancéeAlphorm.com Formation Exchange 2016, Configuration Avancée
Alphorm.com Formation Exchange 2016, Configuration Avancée
 
alphorm.com - Formation Programmer en C++
alphorm.com - Formation Programmer en C++alphorm.com - Formation Programmer en C++
alphorm.com - Formation Programmer en C++
 
Alphorm.com Formation SharePoint 2016 : Installation et Configuration
 Alphorm.com Formation SharePoint 2016 : Installation et Configuration Alphorm.com Formation SharePoint 2016 : Installation et Configuration
Alphorm.com Formation SharePoint 2016 : Installation et Configuration
 
alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)
 
alphorm.com - Formation Exchange Server 2013 (70-341)
alphorm.com - Formation Exchange Server 2013 (70-341)alphorm.com - Formation Exchange Server 2013 (70-341)
alphorm.com - Formation Exchange Server 2013 (70-341)
 
Alphorm.com Formation Apache - Le Guide Complet de l'administrateur
Alphorm.com Formation Apache - Le Guide Complet de l'administrateurAlphorm.com Formation Apache - Le Guide Complet de l'administrateur
Alphorm.com Formation Apache - Le Guide Complet de l'administrateur
 
Alphorm.com Formation knockoutJS
Alphorm.com Formation knockoutJSAlphorm.com Formation knockoutJS
Alphorm.com Formation knockoutJS
 
Alphorm.com Formation PostgreSQL, la Haute Disponibilité
Alphorm.com Formation PostgreSQL, la Haute DisponibilitéAlphorm.com Formation PostgreSQL, la Haute Disponibilité
Alphorm.com Formation PostgreSQL, la Haute Disponibilité
 
Alphorm.com Support de la Formation Exchange 2016 Installation et Configuration
Alphorm.com Support de la Formation Exchange 2016 Installation et ConfigurationAlphorm.com Support de la Formation Exchange 2016 Installation et Configuration
Alphorm.com Support de la Formation Exchange 2016 Installation et Configuration
 
NouveautéS De Visual Basic 2010 V2
NouveautéS De Visual Basic 2010 V2NouveautéS De Visual Basic 2010 V2
NouveautéS De Visual Basic 2010 V2
 
Alphorm.com Formation JavaFX
Alphorm.com Formation JavaFXAlphorm.com Formation JavaFX
Alphorm.com Formation JavaFX
 
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architecture
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architectureAlphorm.com Formation Active Directory 2016 : Le Guide complet de l'architecture
Alphorm.com Formation Active Directory 2016 : Le Guide complet de l'architecture
 
alphorm.com - Formation PostgreSQL administration
alphorm.com - Formation PostgreSQL administrationalphorm.com - Formation PostgreSQL administration
alphorm.com - Formation PostgreSQL administration
 
alphorm.com - Formation XenSources
alphorm.com - Formation XenSourcesalphorm.com - Formation XenSources
alphorm.com - Formation XenSources
 

En vedette

In defence of mobile diversity
In defence of mobile diversityIn defence of mobile diversity
In defence of mobile diversityHervé Mischler
 
Responsive headhache relief for android
Responsive headhache relief for androidResponsive headhache relief for android
Responsive headhache relief for androidHervé Mischler
 
Tour d'horizon des CMS Open Source
Tour d'horizon des CMS Open SourceTour d'horizon des CMS Open Source
Tour d'horizon des CMS Open SourceYannick Pavard
 
Quick tips for porting your iOS designs to Android
Quick tips for porting your iOS designs to AndroidQuick tips for porting your iOS designs to Android
Quick tips for porting your iOS designs to AndroidHervé Mischler
 
[concept] Maquette site web de la bibliothèque universitaire Rennes 2
[concept] Maquette site web de la bibliothèque universitaire Rennes 2[concept] Maquette site web de la bibliothèque universitaire Rennes 2
[concept] Maquette site web de la bibliothèque universitaire Rennes 2Julien Sicot
 
Sql Injection attacks and prevention
Sql Injection attacks and preventionSql Injection attacks and prevention
Sql Injection attacks and preventionhelloanand
 
3 Methods to Master Agile UX Testing | UserZoom Webinar
3 Methods to Master Agile UX Testing | UserZoom Webinar3 Methods to Master Agile UX Testing | UserZoom Webinar
3 Methods to Master Agile UX Testing | UserZoom WebinarUserZoom
 
Bootstrapではじめる、
Webサイト設計のモダンアプローチ
Bootstrapではじめる、
Webサイト設計のモダンアプローチBootstrapではじめる、
Webサイト設計のモダンアプローチ
Bootstrapではじめる、
Webサイト設計のモダンアプローチmasaaki komori
 
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...ANEPMA
 
Architectures.Phpquebec1007
Architectures.Phpquebec1007Architectures.Phpquebec1007
Architectures.Phpquebec1007Damien Seguy
 
Proyecto facilitadores internos
Proyecto facilitadores internosProyecto facilitadores internos
Proyecto facilitadores internosLeonardo Velarde
 
Projet Pasie Grignard
Projet Pasie GrignardProjet Pasie Grignard
Projet Pasie GrignardDFIE Lyon
 
Gramatica del arte
Gramatica del arteGramatica del arte
Gramatica del artelyda79
 

En vedette (20)

In defence of mobile diversity
In defence of mobile diversityIn defence of mobile diversity
In defence of mobile diversity
 
Responsive headhache relief for android
Responsive headhache relief for androidResponsive headhache relief for android
Responsive headhache relief for android
 
Tour d'horizon des CMS Open Source
Tour d'horizon des CMS Open SourceTour d'horizon des CMS Open Source
Tour d'horizon des CMS Open Source
 
Quick tips for porting your iOS designs to Android
Quick tips for porting your iOS designs to AndroidQuick tips for porting your iOS designs to Android
Quick tips for porting your iOS designs to Android
 
[concept] Maquette site web de la bibliothèque universitaire Rennes 2
[concept] Maquette site web de la bibliothèque universitaire Rennes 2[concept] Maquette site web de la bibliothèque universitaire Rennes 2
[concept] Maquette site web de la bibliothèque universitaire Rennes 2
 
SQL Injection
SQL InjectionSQL Injection
SQL Injection
 
SQL Injection
SQL Injection SQL Injection
SQL Injection
 
Sql Injection attacks and prevention
Sql Injection attacks and preventionSql Injection attacks and prevention
Sql Injection attacks and prevention
 
Sql injection
Sql injectionSql injection
Sql injection
 
3 Methods to Master Agile UX Testing | UserZoom Webinar
3 Methods to Master Agile UX Testing | UserZoom Webinar3 Methods to Master Agile UX Testing | UserZoom Webinar
3 Methods to Master Agile UX Testing | UserZoom Webinar
 
Bootstrapではじめる、
Webサイト設計のモダンアプローチ
Bootstrapではじめる、
Webサイト設計のモダンアプローチBootstrapではじめる、
Webサイト設計のモダンアプローチ
Bootstrapではじめる、
Webサイト設計のモダンアプローチ
 
Liligo. Par Guillaume Bril, Liligo
Liligo. Par Guillaume Bril, LiligoLiligo. Par Guillaume Bril, Liligo
Liligo. Par Guillaume Bril, Liligo
 
Ateliers/stages Saint Rémy de Provence
Ateliers/stages Saint Rémy de ProvenceAteliers/stages Saint Rémy de Provence
Ateliers/stages Saint Rémy de Provence
 
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...
Ponencia “Cap. 26000, una herramienta de autoevaluación”. José Manuel Sánchez...
 
Architectures.Phpquebec1007
Architectures.Phpquebec1007Architectures.Phpquebec1007
Architectures.Phpquebec1007
 
Proyecto facilitadores internos
Proyecto facilitadores internosProyecto facilitadores internos
Proyecto facilitadores internos
 
Projet Pasie Grignard
Projet Pasie GrignardProjet Pasie Grignard
Projet Pasie Grignard
 
ljmlkbn jklbn .jkbn l.
ljmlkbn jklbn .jkbn l.ljmlkbn jklbn .jkbn l.
ljmlkbn jklbn .jkbn l.
 
Gramatica del arte
Gramatica del arteGramatica del arte
Gramatica del arte
 
Compendio encuesta
Compendio encuestaCompendio encuesta
Compendio encuesta
 

Similaire à Formation php pdo

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
hassclic270.ppt
hassclic270.ppthassclic270.ppt
hassclic270.pptadiouf2
 
Mise en place du Chattoon en PHP
Mise en place du Chattoon en PHPMise en place du Chattoon en PHP
Mise en place du Chattoon en PHPArmel Diamesso
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPJean-Marc Fontaine
 
Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetDevclic
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partiekadzaki
 
Développer avec le sylius resourcebundle (Symfony live Paris 2015)
Développer avec le sylius resourcebundle (Symfony live Paris 2015) Développer avec le sylius resourcebundle (Symfony live Paris 2015)
Développer avec le sylius resourcebundle (Symfony live Paris 2015) Arnaud Langlade
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015PXNetwork
 
symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...Fabien Potencier
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 
BlueXML Developer Studio
BlueXML Developer StudioBlueXML Developer Studio
BlueXML Developer Studiobch
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyXavier Gorse
 
Partie 1_Matriser les bases PHP v0555555555555.pptx
Partie 1_Matriser les bases PHP v0555555555555.pptxPartie 1_Matriser les bases PHP v0555555555555.pptx
Partie 1_Matriser les bases PHP v0555555555555.pptxHamzaElgari
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 
Deployer PHP et MariaDB dans Azure - TechDays
Deployer PHP et MariaDB dans Azure - TechDaysDeployer PHP et MariaDB dans Azure - TechDays
Deployer PHP et MariaDB dans Azure - TechDaysChristophe Villeneuve
 
Déployez votre site PHP / MariaDB, simplement et rapidement dans Azure
Déployez votre site PHP / MariaDB, simplement et rapidement dans AzureDéployez votre site PHP / MariaDB, simplement et rapidement dans Azure
Déployez votre site PHP / MariaDB, simplement et rapidement dans AzureMicrosoft
 
Php & My Sql
Php & My SqlPhp & My Sql
Php & My Sqlcecile59
 

Similaire à Formation php pdo (20)

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
hassclic270.ppt
hassclic270.ppthassclic270.ppt
hassclic270.ppt
 
Mise en place du Chattoon en PHP
Mise en place du Chattoon en PHPMise en place du Chattoon en PHP
Mise en place du Chattoon en PHP
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHP
 
Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internet
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partie
 
Développer avec le sylius resourcebundle (Symfony live Paris 2015)
Développer avec le sylius resourcebundle (Symfony live Paris 2015) Développer avec le sylius resourcebundle (Symfony live Paris 2015)
Développer avec le sylius resourcebundle (Symfony live Paris 2015)
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015
 
symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
BlueXML Developer Studio
BlueXML Developer StudioBlueXML Developer Studio
BlueXML Developer Studio
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec Symfony
 
Partie 1_Matriser les bases PHP v0555555555555.pptx
Partie 1_Matriser les bases PHP v0555555555555.pptxPartie 1_Matriser les bases PHP v0555555555555.pptx
Partie 1_Matriser les bases PHP v0555555555555.pptx
 
Cours Php
Cours PhpCours Php
Cours Php
 
Cours Php
Cours PhpCours Php
Cours Php
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Deployer PHP et MariaDB dans Azure - TechDays
Deployer PHP et MariaDB dans Azure - TechDaysDeployer PHP et MariaDB dans Azure - TechDays
Deployer PHP et MariaDB dans Azure - TechDays
 
Déployez votre site PHP / MariaDB, simplement et rapidement dans Azure
Déployez votre site PHP / MariaDB, simplement et rapidement dans AzureDéployez votre site PHP / MariaDB, simplement et rapidement dans Azure
Déployez votre site PHP / MariaDB, simplement et rapidement dans Azure
 
Php & My Sql
Php & My SqlPhp & My Sql
Php & My Sql
 

Formation php pdo

  • 1. 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™™ ©©