PDO: comprendre et corriger les erreurs les plus fréquentes

Page 1 sur 12Lecteur de document UniversityLib

PDO: comprendre et corriger les erreurs les plus fréquentes

Software Development (PHP) · notes

Voir tous les documents en développement web

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

%

PDF

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