Request Parameters
prepare et execute - Requêtes avec paramètres
Lorsque la requête SQL à exécuter comporte des paramètres, il faut utiliser une technique différente.
1 - Première formulation
⋮
// Préparation de la requête : le ? correspond au paramètre attendu
$req = $bdd->prepare("select * from employe where servempl=?");
// Exécution de la requête en lui passant le tableau des arguments
// (ici un seul élément : le code du service)
$req->execute($_POST['service']);
⋮
Ce code source utilise ce qu’on appelle une requête préparée. Il s’agit d’une technique dans laquelle on définit d’abord
le squelette de la requête (appel de la méthode prepare
sur l’objet $bdd
) en prévoyant ses différents paramètres,
indiqués par des ?
dans le code SQL. Ensuite, on exécute la requête préparée (méthode execute sur l’objet $req
).
Lors de cet appel, on passe les paramètres nécessaires sous la forme d’un tableau.
Le tableau des paramètres doit contenir autant d’élément qu’il y a de ? dans la requête préparée. L’ordre doit également être respecté.
2 - Deuxième formulation
Dans cette formulation, le nom des variables est explicite, on ne met plus de ?
.
⋮
// Préparation de la requête : le ? correspond au paramètre attendu
$req = $bdd->prepare("select * from employe where servempl=:service");
// Passage des arguments
$req->bindParam(':service', $_POST['service'], PDO::PARAM_STR);
// PDO::PARAM_STR signifie que :service est de type string
// Exécution de la requête
$req->execute();
⋮
La technique ci-dessus rend la base vulnérable aux attaques de type “injection SQL”. L’injection SQL consiste à faire exécuter des requêtes SQL imprévues par le SGBDR, ce qui peut conduire à de graves problèmes de sécurité.

Ce risque de sécurité n’existe pas lorsqu’on utilise des requêtes préparées,
Ici, pas besoin de “nettoyer” la variable
$_POST['service']
reçue du formulaire comme nous l’avions fait dans le chapitre précédent. L’appel, à htmlspecialchars
, désactive l’exécution de code JavaScript, mais ne présente aucun intérêt dans le cas de données utilisées dans des requêtes SQL.