Une requête préparée ou requête paramétrable est utilisée pour exécuter la même requête plusieurs fois, avec une grande efficacité. L’avantages des requêtes préparées c’est qu’elles utilisent moins de ressources et s’exécutent plus rapidement.
Une requête préparée passe par deux étapes une étape de préparation et une étape d’exécution:
- L’étape de preparation consiste à preparer la requête et de l’envoyer au serveur pour l’exécution.
- L’étape de l’exécution consiste à executer la requête préparée en lui passant des paramètre si necessaire. Les paramètres d’une requête préparées peuvent être des marqueurs interrogatifs “?” ou des marqueurs nommés:
Préparation d’une Requête préparée
Pour preparer une requête on utilise la méthode prepare de l’objet PDO en lui passant des paramètre si necessaire. Cette requête retourne un objet de type PDOStatement qui représente le résultat de notre requête préparée.
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=mabase', 'root', 'pass');
} catch (PDOException $e) {
echo $e->getMessage();
}
$sql = "SELECT * FROM personne";
$ps = $pdo->prepare($sql);
$ps->execute();
while ($p = $ps->fetch()) {
echo $p['nom'];
}
Liaison des paramètres
Il existe plusieurs moyens de lier les paramètres avec des valeurs ou des variables. C’est -a-dire de remplacer les paramètres par les valeurs:
- Soit on regroupe les valeurs dans un tableau et on passera ce tableau en paramètre à la méthode
execute
comme dans l’exemple ci-dessous, si on utilise des marqueur interrogatif “?”
$ps = $pdo->prepare("INSERT INTO personne (nom,prenom,sexe) VALUES (?,?,?)");
$ps->execute(['Richard', 'Joe', 'Masculin']);
//Dans le cas d'un formulaire
$ps->execute([$_POST['nom'], $_POST['prenom'], $_POST['sexe']]);
- Soit on regroupe les valeurs dans un tableau associatif et on passera ce tableau en paramètre à la méthode execute comme dans l’exemple ci-dessous, si on utilise des marqueur nommer :nom par exemple.
$ps = $pdo->prepare("INSERT INTO personne (nom,prenom,sexe) VALUES (:nom,:prenom,:sexe)");
$ps->execute([
'nom' => 'Herard',
'prenom' => 'Herard',
'sexe' => 'Masculin'
]);
//Dans le cas ou on a un formulaire
$ps->execute([
'nom' => $_POST['prenom'],
'prenom' => $_POST['prenom'],
'sexe' => $_POST['sexe']
]);
Supposons qu’on souhaite effectuer une recherche dans une base de données. On veut récupérer des personne qui ont le nom Pierre.
Exemple marqueur interrogatif
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=mabase', 'root', 'pass');
} catch (PDOException $e) {
echo $e->getMessage();
}
$sql = "SELECT nom, prenom FROM personne WHERE nom = ?";
$ps = $pdo->prepare($sql);
$ps->execute(['Pierre']);
//$ps->execute([$_POST['Pierre']);
while ($p = $ps->fetch()) {
echo $p['prenom'];
}
Meme exemple avec les marqueurs nommés
Les marqueurs nommés représentent des clefs dans un tableau associatif qu’on peut les associées à leurs valeurs.
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=mabase', 'root', '1qaz');
} catch (PDOException $e) {
echo $e->getMessage();
}
$sql = "SELECT nom, prenom FROM personne WHERE nom = :nom";
$ps = $pdo->prepare($sql);
$ps->execute(['nom'=>'Pierre']);
//$ps->execute(['nom'=>$_POST['Pierre']);
while ($p = $ps->fetch()) {
echo $p['prenom'];
}
Dans cet exemple on va insérer des données dans la table personne créer préalablement en utilisant une requête préparée. Les requêtes préparées nous permettent d’inviter des injections SQL.
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=mabase', 'root', 'pass');
} catch (PDOException $e) {
echo $e->getMessage();
}
$ps = $pdo->prepare("INSERT INTO personne (nom,prenom,sexe) VALUES (?,?,?)");
$ps->execute([
'Richard', 'Joe', 'Masculin'
]);
Dans une requête paramétrée chaque marqueur représente une valeur.
Insertion de données dans la table personne en utilisant des marqueurs nommés pour remplacer les valeurs de notre requête paramétré.
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=mabase', 'root', '1qaz');
} catch (PDOException $e) {
echo $e->getMessage();
}
$ps = $pdo->prepare("INSERT INTO personne (nom,prenom,sexe) VALUES (:nom,:prenom,:sexe)");
$ps->execute([
'nom' => 'Herard',
'prenom' => 'Herard',
'sexe' => 'Masculin',
]);
Lorsque les données de votre base de données provient de nimporte quels utilisateurs il faut penser aux injections SQl. Pour empêcher les injections SQL, Je vous conseille d’utiliser les requêtes préparées qui est fournie par PDO.