31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
$
Accueil
Cours
PDO : comprendre et corriger les erreurs les plus fr quentes
PDO : comprendre et corriger les erreurs les plus fr quentes
2
? Z
& Facile
Licence
Bonjour tous !
Vous venez d'apprendre le PHP gr ce au cours de M@teo21 ? Ou bien vous connaissez d j le PHP mais vous souhaitez
abandonner l'API MySQL pour passer PDO ? Vous vous embrouillez avec toutes ces nouveaut s ?
Cet article a pour objectif de vous aider comprendre votre code, et corriger vous-m me vos erreurs les plus
simples.
Les pr requis sont les suivants :
avoir suivi le cours de M@teo21 sur le PHP et termin la partie qui concerne la base de donn es (ou niveau
quivalent) ;
PDO tant un ensemble de classes, quelques notions de POO pourront vous aider. Toutefois, je d finirai les termes que
j'utilise dans la premi re partie.
Cet article n'a pas pour vocation de vous apprendre utiliser PDO, mais de vous apprendre comprendre ce
que vous faites avec. Vous devez d j savoir utiliser les principales m thodes des classes de PDO.
Un peu de vocabulaire
Introduction
T
Pour commencer, je vous propose un petit rappel sur le vocabulaire de base de la POO, car PDO est compos de trois
classes. Notez que je ne vous ferai pas de cours sur la POO, d'autres s'en sont d j charg s (cours de M@teo21, cours
de vyk12). Je me contenterai de rappeler la d finition de quelques mots-cl s.
Si vous tes l'aise avec la POO, vous pouvez sauter cette partie. Si vous avez le moindre doute, je vous conseille de la
lire tout de m me. Vous n'en aurez que pour quelques minutes et a ne pourra vous faire que du bien !
Quelques d finitions
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
1/12
<@31/12/2015
Classe
PDO : comprendre et corriger les erreurs les plus fr quentes
La classe est le moule qui permettra de cr er des objets. Elle contient les attributs et les m thodes qui d finissent
l'objet. Par exemple, PDO est une classe. Il en va de m me pour PDOStatement et PDOException.
Attribut
Un attribut, parfois nomm variable d'instance, est une variable propre l'objet. Lorsque l'on con oit une classe, il
faut se poser la question De quoi est constitu mon objet ? pour trouver quels attributs lui donner. Par exemple,
pour un objet "Client", on pourra r pondre cette question en disant qu'un client est constitu d'un num ro de client,
d'un pr nom, d'un nom, d'une adresse, d'un num ro de t l phone etc. On cr era donc autant d'attributs.
M thode
Une m thode est une fonction propre l'objet. Lorsque l'on con oit une classe, il faut se poser la question Que peut
faire mon objet ? pour trouver quelles m thodes impl menter. Par exemple, un client peut changer de nom,
d'adresse, de num ro de t l phone etc.
Instance
Une instance est tout simplement un exemplaire de notre objet. En PHP, le code suivant cr e une instance de l'objet
"Client" qui sera accessible via la variable $client :
html+php
1
2
<?php
$client = new Client();
Cette instruction utilise le moule (la classe Client) pour cr er une instance (ou occurrence) de cette classe. Cette
instance poss de tous les attributs et toutes les m thodes propres la classe Client.
R capitulatif
html+php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class Classe // Ici on d clare la classe.
{
// Ici on d clare les attributs de la classe :
private $attribut1 = 0;
private $attribut2 = '';
// Ceci est une m thode de la classe Classe :
public function methode()
{
// Instructions de la m thode.
}
}
$classe = new Classe(); // On construit une instance de la classe Classe.
/*
- Cette instance poss de tous les attributs et toutes les m thodes
- de la classe Classe : attribut1, attribut2 et methode().
*/
Une convention d' criture conna tre
Pour d signer la m thode d'une classe, les programmeurs ont l'habitude de faire pr c der son nom de celui de sa
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
2/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
classe puis d'un double deux-points "::" , afin de savoir au premier coup d'Sil quelle classe elle appartient, et de ne
pas la confondre avec une m thode homonyme d'une autre classe.
Par exemple, pour d signer la m thode methode() de la classe Classe j' crirai Classe::methode(), et pour la m thode
query() de la classe PDO j' crirai PDO::query().
Ce sera tout pour le vocabulaire ! Si vous n'avez pas compris ces quelques termes, je vous conseille de jeter un Sil
l'un des cours que j'ai cit s tout l'heure :
la POO en PHP selon M@teo21 ;
la POO en PHP selon vyk12.
Les options de configuration
Introduction
T
Ma requ te ne fonctionne pas, et pourtant je n'ai aucun message d'erreur !
J'ai une erreur "Call to a member function fetch() on a non-object". Je ne comprends pas, pourtant j'appelle la
m thode comme dans le tuto !
H oui ! Il faut savoir que par d faut, PDO n'affiche pas les erreurs SQL. Or, en tant que d veloppeur, vous devez aimer
les messages d'erreurs ! Si, si ! Sans eux, on n'a aucune id e de l'endroit o l'on s'est tromp . Parfois m me, ils nous
disent ce qui ne va pas.
La preuve qu'ils sont utiles : PDO n'affiche pas les erreurs, et vous tes perdu.
Des erreurs myst rieuses
Bon, j'ai compris pourquoi quand je faisais une erreur SQL, je n'avais pas de message d'erreur. Mais pourquoi
est-ce que parfois j'ai une erreur sur le fetch(), alors ?
H bien tout d'abord, il faut se souvenir que l'on travaille avec deux langages :
PHP ;
SQL.
Or, PDO ne vous montre pas les erreurs SQL. Les erreurs PHP ne sont pas influenc es par PDO, elles sont influenc es
par la configuration de PHP.
Autrement dit, l'erreur que vous pouvez voir sur le fetch() est une erreur PHP caus e indirectement par une erreur SQL
que vous ne voyez pas.
Prenons un code de base de s lection de donn es avec PDO :
1
Publicité
<?php
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
html+php
3/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
2
3
4
5
6
$stmt = $pdo>query('SELECT id, auteur, contenu, date FROM messages');
while($message = $stmt>fetch())
{
// Utilisation des donn es.
}
Admettons que, pour une raison ou pour une autre, ma requ te choue. Que va-t-il se passer ? Regardons la
documentation de la m thode PDO::query().
Citation : php.net
PDO::query() retourne un objet PDOStatement, ou FALSE si une erreur survient.
Un objet de la classe PDOStatement ? H oui, si vous avez la curiosit de jeter un Sil la documentation de cette
classe, vous vous apercevrez que c'est cette classe qui poss de la m thode fetch(). Si ma requ te r ussit, $stmt sera
donc une instance de la classe PDOStatement. Mais si elle choue, elle contiendra uniquement& FALSE !
Vous avez compris ? Si la requ te choue, il n'y a pas d'objet PDOStatement (pas d'objet du tout m me, on obtient un
bool en !). Sans objet, pas de m thode. Par cons quent, PHP nous pr vient qu'on essaie d'appeler une m thode sur
quelque chose qui n'est pas un objet, et que c'est donc impossible !
Et pourquoi aucun message d'erreur n'est affich parfois ?
Tout simplement parce que dans le cas d'une requ te de type UPDATE ou DELETE, on n'utilise pas (ou rarement) la
valeur de retour de la m thode.
Vous l'aurez compris, il devient urgent de demander poliment PDO de nous pr venir en cas de probl me.
Afficher les erreurs SQL
Pour modifier les param tres de PDO, nous avons deux solutions. Soit on donne les options directement au
constructeur, soit on utilise la m thode PDO::setAttribute(). Je vais vous montrer ces deux m thodes, vous choisirez
celle qui vous fait plaisir.
Il faut galement savoir que l'on peut demander PDO de nous avertir de deux fa ons :
avec une erreur type "WARNING" ;
avec une exception.
Vous connaissez d j les erreurs WARNING. Un exemple ? Vous y avez droit si vous oubliez de donner un param tre
une fonction : "Warning: Wrong parameter count for intval()". Si vous choisissez ce mode, vous aurez une erreur de ce
type en cas d'erreur SQL.
En ce qui concerne les exceptions, vous en avez d j vu au moins une ! Souvenez-vous, quand vous construisiez votre
objet PDO :
Citation : Cours de PHP
1
<?php
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
html+php
4/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
2
3
4
5
6
7
8
9
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch (Exception $e)
{
die('Erreur : ' . $e>getMessage());
}
Ici, $e est une exception. Les exceptions sont lanc es par l'instruction throw et peuvent tre intercept es par un bloc
catch(). Je ne vous en dis pas plus, je ne compte pas vous faire un cours sur les exceptions. Si vous tes curieux, vous
chercherez de votre c t .
Demander un WARNING
Sans plus attendre, voici comment demander PDO d'afficher des erreurs WARNING en cas de probl me.
Vous pouvez passer un array en quatri me param tre du constructeur. Cet array devra avoir pour cl le nom de
l'attribut modifier, et pour valeur& la valeur de l'attribut modifier. En ce qui nous concerne, l'attribut modifier
est PDO::ATTR_ERRMODE et sa valeur PDO::ERRMODE_WARNING. On le comprend tr s bien : ATTR mis pour "attribut",
et ERRMODE pour "error mode".
Sinon, vous pouvez utiliser la m thode PDO::setAttribute(). Elle prend deux param tres : l'attribut modifier et sa
nouvelle valeur.
Voyez plut t :
1
2
3
1
2
3
4
<?php
// Je donne les param tres au constructeur :
$pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'root', '', array(PDO::ATTR_ERRMODE =>
PDO::ERRMODE_WARNING));
<?php
// Je construis mon objet, puis je donne le param tre PDO::setAttribute() :
$pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'root', '');
$pdo>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
Demander une EXCEPTION
Allez, je suis s r que vous pouvez trouver tout seul en cherchant la bonne valeur de l'attribut dans la liste des
constantes pr d finies de PDO.
PDO::ERRMODE_EXCEPTION ? Oui, bravo ! Regardez ce que a donne :
1
2
3
1
2
3
4
<?php
// Je donne les param tres au constructeur :
$pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'root', '', array(PDO::ATTR_ERRMODE =>
PDO::ERRMODE_EXCEPTION ));
<?php
// Je construis mon objet, puis je donne le param tre PDO::setAttribute() :
$pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'root', '');
$pdo>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
html+php
html+php
html+php
html+php
Et voil , vos erreurs ne sont plus silencieuses ! Si vous choisissez les exceptions, mettez vos requ tes dans un bloc
try/catch pour pouvoir les attraper. Un exemple ? Le voici :
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
html+php
5/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
1
2
3
4
5
6
7
8
9
10
11
Publicité
12
13
14
15
<?php
try
{
$pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'root', '', array(PDO::ATTR_ERRMODE =>
PDO::ERRMODE_EXCEPTION ));
$stmt = $pdo>query('SELECT id, auteur, contenu, DATE_FORMAT(date, "%W %d %M %Y %Hh%i") as
date FROM messages');
$messages = $stmt>fetchAll(PDO::FETCH_OBJ);
}
catch(Exception $e)
{
exit('<b>Catched exception at line '. $e>getLine() .' :</b> '. $e>getMessage());
}
foreach($messages as $message)
{
echo '<p>Le ', $message>date, ' par ', $message>auteur, ' : <br />', $message>contenu,
'</p>';
}
D'autres attributs modifier !
Si vous regardez plus en d tail la liste des constantes de PDO que je vous ai montr e tout l'heure, vous vous
apercevrez que ERRMODE n'est pas le seul attribut modifiable. Par exemple, j'aime bien modifier le
DEFAULT_FETCH_MODE, plut t que de le donner chaque fois mes m thodes PDOStatement::fetch() ou
PDOStatement::fetchAll().
Si vous tes attentif, vous remarquerez que toutes les constantes qui commencent par PDO::ATTR_ sont des attributs
que l'on peut modifier. Par exemple pour le fetch mode par d faut : PDO::ATTR_DEFAULT_FETCH_MODE fera l'affaire.
Les valeurs possibles pour cet attribut sont les constantes qui commencent par PDO::FETCH_.
En bonus, voici comment je construis mon propre objet PDO. vous d'adapter ce code selon vos go ts et vos besoins :
html+php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
try
{
$db_config = array();
$db_config['SGBD'] = 'mysql';
$db_config['HOST'] = 'localhost';
$db_config['DB_NAME'] = 'tests';
$db_config['USER'] = 'root';
$db_config['PASSWORD'] = '';
$db_config['OPTIONS'] = array(
// Activation des exceptions PDO :
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// Change le fetch mode par d faut sur FETCH_ASSOC ( fetch() retournera un tableau
associatif ) :
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($db_config['SGBD'] .':host='. $db_config['HOST'] .';dbname='.
$db_config['DB_NAME'],
$db_config['USER'],
$db_config['PASSWORD'],
$db_config['OPTIONS']);
unset($db_config);
}
catch(Exception $e)
{
trigger_error($e>getMessage(), E_USER_ERROR);
}
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
6/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
N'h sitez pas parcourir la documentation des trois classes qui composent PDO pour apprendre les utiliser.
S curiser ses requ tes
Introduction
T
On parle beaucoup des injections SQL. Cette technique consiste crire du code SQL dans un champ de texte pour
d tourner l'utilisation d'une requ te a priori inoffensive pour une utilisation malveillante.
Sur les forums, je lis souvent avec PDO, pas besoin de s curiser ses requ tes, a le fait tout seul .
Ceci est faux.
Cette affirmation r sulte d'une confusion entre PDO et les requ tes pr par es. Comme je l'ai d j dit, cet article n'a
pas vocation vous apprendre utiliser ce genre de chose. D'autres s'en chargent bien mieux que moi dans le tutoriel
de M@teo21 ou celui de Draeli.
En revanche, je vais vous expliquer dans quel cas il faut se prot ger, et comment.
Une histoire de types
Il y a deux cat gories de variables que l'on utilise dans une requ te SQL : les nombres (int, float, double&) et les
cha nes de caract res.
Or, une injection SQL est constitu e de code SQL, et donc de texte. Cela signifie qu'une variable qui contient
uniquement un nombre n'est pas dangereuse.
Seulement voil , il existe une r gle tr s importante en informatique : never trust user input, soit en fran ais "ne faites
jamais confiance aux donn es entr es par l'utilisateur". En effet, celui-ci peut se tromper ou pire : tenter d'ins rer un
code malveillant !
Avant d'utiliser une variable utilisateur (c'est- -dire les variables dont la valeur peut tre influenc e par l'utilisateur)
cens e contenir un nombre, il faut v rifier qu'elle en contient effectivement un.
Pour cela plusieurs solutions s'offrent vous. Soit vous faites une condition avec une fonction is_type(), comme par
exemple is_int(). Soit vous convertissez (on peut aussi dire "transtyper") cette valeur en nombre.
Voici deux fa ons de proc der pour r aliser cette conversion (ou "cast" en anglais) :
html+php
1
2
3
4
5
6
<?php
// Premi re m thode : en pr cisant le type de destination.
$id = (int) $_GET['id'];
// Seconde m thode : en utilisant la fonction intval().
$id = intval($_GET['id']);
Si la variable ne contenait pas un nombre entier, alors sa nouvelle valeur sera 0. C'est tr s pratique lorsque l'on sait
que les champs auto-incr ment s commencent 1. Si apr s la conversion vous obtenez 0 : soit la variable ne
contenait pas un entier, soit elle contenait z ro. Quoi qu'il arrive nous n'aurions pas pu trouver d'identifiant
correspondant.
Lorsque vous voulez r cup rer un identifiant auto_increment, vous pouvez donc proc der comme ceci :
1
<?php
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
Publicité
html+php
7/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
2
3
4
5
6
7
8
9
10
11
12
$id = (int) $_GET['id'];
if($id <= 0)
{
/* L'identifiant est invalide. Vous pouvez faire une redirection,
- un message d'erreur& bref ce que vous voulez !
*/
}
else
{
// Faites votre requ te en toute confiance : un nombre entier, c'est inoffensif !
}
Voil pour les nombres. Ce n'est pas tr s compliqu , il suffit de v rifier que la variable sur laquelle on travaille est
effectivement un nombre.
En revanche, pour les cha nes de caract res& cela va d pendre de comment vous proc dez !
Les requ tes pr par es
Bon nombre de Z ros comprennent mal le fonctionnement des requ tes pr par es. On leur a dit "avec une requ te
pr par e, on ne peut pas subir d'injection SQL". C'est vrai, mais seulement si on utilise correctement les requ tes
pr par es !
Pour faire simple, toutes les donn es que vous envoyez la requ te via PDOStatement::bindValue(),
PDOStatement::bindParam() ou PDOStatement::execute() ne risquent pas de provoquer une injection.
Si vous voulez comprendre pourquoi, je vous conseille cet article de Draeli qui explique le m canisme des requ tes
pr par es.
En revanche, toutes les variables utilisateur qui sont pr sentes dans la cha ne de caract res donn e en param tre
repare() peuvent causer une injection SQL ! En th orie, aucune variable utilisateur ne devrait se trouver ici.
PDO:
Vous devriez utiliser une des trois fonctions que j'ai cit es plus haut. Toutefois, si cela s'av re indispensable, vous
pouvez utiliser la m me m thode que celle que je vais vous donner pour PDO::query() et PDO::exec().
Un exemple de faille :
1
2
3
<?php
$stmt = $pdo>prepare("SELECT * FROM membres WHERE pseudo = $pseudo");
$stmt>execute();
Voici une vraie requ te pr par e :
1
2
3
<?php
$stmt = $pdo>prepare("SELECT * FROM membres WHERE pseudo = :pseudo");
$stmt>execute(array('pseudo' => $pseudo));
Et encore plus joli !
1
2
3
4
<?php
$stmt = $pdo>prepare("SELECT * FROM membres WHERE pseudo = :pseudo");
$stmt>bindValue('pseudo', $pseudo, PDO::PARAM_STR);
$stmt>execute();
Les m thodes PDO::query() et PDO::exec()
html+php
html+php
html+php
Si pour une raison ou pour une autre, vous n'utilisez pas une requ te pr par e, alors toutes vos variables qui
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
8/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
contiennent des cha nes de caract res doivent tre prot g es l'aide de la m thode PDO::quote().
Comment a "encore une m thode" ? Allez, ne faites pas la t te, cette m thode s'occupe de tout ! Elle entoure m me
votre cha ne de caract res avec des guillemets !
<?php
$stmt = $pdo>query('SELECT id FROM membres WHERE pseudo = '. $pdo>quote($_POST['pseudo']));
html+php
1
2
1
2
<?php
$pdo>exec('INSERT INTO livre_or(pseudo, message, date_post) VALUES('. $pdo
>quote($_POST['pseudo']) .', '. $pdo>quote($_POST['message']) .', NOW())');
PDOStatement::execute() et le type INT
Les sympt mes
Une erreur tr s fr quente est bas e sur le comportement de PDOStatement::execute().
Essayez donc ce genre de requ te :
1
2
3
4
<?php
$offset = 5;
$stmt = $pdo>prepare('SELECT * FROM messages LIMIT 0, ?');
$stmt>execute(array($offset));
html+php
T
html+php
Le but de cette requ te est de r cup rer un certain nombre d'entr es dans la table messages. Ce nombre est d fini par
une variable (ici : $offset).
Si vous avez correctement configur PDO, vous devez avoir ce message d'erreur :
Citation : Erreur
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use near ''5'' at line 1
Et pourtant, cette requ te fonctionne :
1
2
3
<?php
$stmt = $pdo>prepare('SELECT * FROM messages LIMIT 0, 5');
$stmt>execute();
html+php
Alors quoi ? Normalement, execute() remplace le marqueur ? par la valeur de la variable, donc 5. Le r sultat
est le m me, non ?
Non. a vous en bouche un coin, hein ?
En fait, si on prend la peine de lire la documentation de PDOStatement::execute(), on peut y trouver cette phrase qui
d crit l'array pass en param tre :
Citation : php.net
Un tableau de valeurs avec autant d' l ments qu'il y a de param tres associer dans la requ te SQL qui sera
ex cut e. Toutes les valeurs sont trait es comme des constantes PDO::PARAM_STR.
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
9/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
C'est la partie en gras qui est importante. Pour execute(), tout est cha ne de caract res. Par cons quent, il va entourer
de quotes toutes les valeurs qu'on lui donne. La requ te ex cut e ressemble cela : SELECT * FROM messages
LIMIT 0, '5' , ce qui produit une erreur de syntaxe.
Pourtant j'ai fait cette requ te et je n'ai pas de probl me de type, alors que mon champ id est de type INT !
sql
Publicité
1
SELECT * FROM table WHERE id = '1';
Comment a se fait ?
MySQL est tr s permissif. Il va transtyper '1' en entier, et cela suffira (tandis que sur d'autres SGBD, cela pourrait ne pas
fonctionner). En revanche, pour un LIMIT, il ne fera pas cette op ration et signalera une erreur de syntaxe.
Alors, je ne dois plus donner de param tre execute() ?
Si. Vous le pouvez tant que les param tres que vous donnez sont des cha nes de caract res !
En pratique, j'ai pris l'habitude de ne plus donner aucun param tre execute(), car je trouve que l'autre solution rend
le code plus lisible.
PDOStatement::bindValue() et PDOStatement::bindParam()
Je vous conseille d'aller voir ce que dit la documentation propos de ces deux m thodes. Elles s'utilisent toutes les
deux de la m me fa on. Il y a trois param tres donner :
le nom du marqueur remplacer ;
la valeur utiliser ;
le type de valeur envoyer. On utilise pour cela les constantes de PDO. En pratique, ce sera presque toujours
PDO::PARAM_INT (pour un entier) ou PDO::PARAM_STR (pour une cha ne de caract res).
Si on reprend notre exemple avec le LIMIT, voici le r sultat avec bindValue() :
1
2
3
4
5
<?php
$offset = 5;
$stmt = $pdo>prepare('SELECT * FROM messages LIMIT 0, :offset');
$stmt>bindValue('offset', $offset, PDO::PARAM_INT);
$stmt>execute();
Hourra, cela fonctionne cette fois-ci !
Y a-t-il une diff rence entre bindValue() et bindParam() ?
html+php
Oui ! Traduisons le nom de ces m thodes en fran ais : "bind value" signifie "lier une valeur" tandis que "bind param"
signifie "lier un param tre". La diff rence est simple, mais subtile : bindValue() lie la valeur d'une variable, tandis que
bindParam() lie la variable elle-m me.
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
10/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
N'oubliez pas qu'une requ te pr par e peut tre ex cut e plusieurs fois en appelant plusieurs fois execute(). Ainsi, si
l'on utilise bindParam(), il suffira de changer la valeur de la variable li e puis de rappeler execute() pour faire une
nouvelle requ te.
Les deux codes suivants produisent les m mes requ tes :
html+php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$id_membre = 1;
$message = 'Bonjour :)';
$stmt = $pdo>prepare('INSERT INTO minichat(id_membre, message) VALUES(:id_membre, :message)');
$stmt>bindValue('id_membre', $id_membre, PDO::PARAM_INT);
$stmt>bindValue('message', $message, PDO::PARAM_STR);
$stmt>execute();
$id_membre = 2;
$message = 'Salut !';
$stmt>bindValue('id_membre', $id_membre, PDO::PARAM_INT);
$stmt>bindValue('message', $message, PDO::PARAM_STR);
$stmt>execute();
<?php
$id_membre = 1;
$message = 'Bonjour :)';
html+php
$stmt = $pdo>prepare('INSERT INTO minichat(id_membre, message) VALUES(:id_membre, :message)');
$stmt>bindParam('id_membre', $id_membre, PDO::PARAM_INT);
$stmt>bindParam('message', $message, PDO::PARAM_STR);
$stmt>execute();
$id_membre = 2;
$message = 'Salut !';
$stmt>execute();
L , je n'ai modifi les valeurs qu'une seule fois. Mais admettons que j'aie besoin de les modifier 10 fois ou 100 fois !
Dans ce cas, cela reste plus pratique que de rappeler bindValue() chaque fois.
Ce sera tout pour les erreurs typiques de ceux qui d butent avec PDO ! Si vous en voyez d'autres ou que vous pensez
que certains points n cessitent d' tre clarifi s ou d velopp s, n'h sitez pas me contacter.
Si vous avez des questions, je r pondrai avec plaisir vos MP. Pr f rez un message sur les forums ou dans les
commentaires, ainsi la r ponse profitera tout le monde et vous aurez d'autres points de vue que le mien.
J'insiste une nouvelle fois sur ce point : utilisez la documentation (doc PHP, doc PDO) ! Lisez la description des
m thodes, de leurs param tres et de leurs valeurs de retour. C'est comme cela que vous comprendrez au mieux
comment les utiliser.
Th matiques du cours : Base de donn es PHP Web
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
11/12
31/12/2015
PDO : comprendre et corriger les erreurs les plus fr quentes
L'auteur
D couvrez aussi ce cours en...
Guillaume
Charmetant
%
OpenClassrooms
Professionnels
Participez
Qui sommes-nous ?
Affiliation
Cr er un cours
Fonctionnement de nos cours
Entreprises
CourseLab
Recrutement
Nous contacter
Suivez-nous
Le blog OpenClassrooms
Universit s et coles
Aider traduire
Conditions G n rales d'Utilisation
$ 6 ;
https://openclassrooms.com/courses/pdo comprendre et corriger les erreurs les plus frequentes
12/12