Requêtes préparées
Requêtes préparées
Création de requête préparée
Une requête préparée, c'est en fait un modèle de requête que l'on enregistre le temps de la session et auquel on donne un nom. On va ensuite pouvoir l'exécuter en l'appelant grâce à son nom, et en lui passant éventuellement un ou plusieurs paramètres.
Syntaxe :PREPARE nom_requete FROM 'requete_preparable';
PREPARE select_race FROM 'SELECT * FROM Race';
PREPARE select_client FROM 'SELECT * FROM Client WHERE email = ?';
PREPARE select_adoption FROM 'SELECT * FROM Adoption WHERE client_id = ? AND animal_id = ?';
Le nom de la requête préparée ne doit pas être entre guillemets. Par contre, la requête à préparer doit l'être. La requête à préparer doit être passée comme une chaîne de caractères. Pas de guillemets non plus autour du ?
Les paramètres d'une requête préparée ne peuvent représenter que des données, des valeurs, pas des noms de tables ou de colonnes ni des morceaux de commandes SQL.
Suppression d'une requête préparée
Pour supprimer une requête préparée, on utilise DEALLOCATE PREPARE
DEALLOCATE PREPARE select_race;
Les requêtes préparées sont principalement utilisées pour deux raisons :
-> protéger son application des injections SQL;
-> gagner en performance dans le cas d'une requête exécutée plusieurs fois par la même session.
Variable utilisateur
Comme la requête à préparer est donnée sous forme de chaîne de caractères, il est également possible d'utiliser une variable utilisateur (@nomdevariable) dans laquelle on enregistre tout ou partie de la requête à préparer.
Exemple de requête préparée avec variable utilisateurSET @req = 'SELECT * FROM Race'; PREPARE select_race FROM @req;
SET @colonne = 'nom'; SET @req_animal = CONCAT('SELECT ', @colonne, ' FROM Animal WHERE id = ?'); PREPARE select_col_animal FROM @req_animal;
Exécution d'une requête préparée
Pour exécuter une requête préparée, on utilise la commande suivante :
EXECUTE nom_requete [USING @parametre1, @parametre2, ...];
EXECUTE select_race; SET @id = 3; EXECUTE select_col_animal USING @id; SET @client = 2; EXECUTE select_adoption USING @client, @id; SET @email = 'jean.dupont@email.com'; EXECUTE select_client USING @email; SET @email = 'marie.boudur@email.com'; EXECUTE select_client USING @email; SET @email = 'fleurtrachon@email.com'; EXECUTE select_client USING @email; SET @email = 'jeanvp@email.com'; EXECUTE select_client USING @email; SET @email = 'johanetpirlouit@email.com'; EXECUTE select_client USING @email;
Usage et utilité
En fait, les commandes PREPARE, EXECUTE et DEALLOCATE sont très rarement utilisée car on leur préfère des API (interfaces de programmation) qui permettent de faire des requêtes préparées sans exécuter nous-mêmes les commandes SQL. Par exemple, en PHP, on utilise l'extension PDO pour préparer et exécuter une requête
<?php
try {
$email = 'yo@email.com';
// On se connecte
$bdd = new PDO('mysql:host=localhost;dbname=elevage', 'sdz', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ));
// On prépare la requête
$requete = $bdd->prepare("SELECT * FROM Client WHERE email = :email");
// On lie la variable $email définie au-dessus au paramètre :email de la requête préparée
$requete->bindValue(':email', $email, PDO::PARAM_STR);
//On exécute la requête
$requete->execute();
// On récupère le résultat
if ($requete->fetch()) {
echo 'Le client existe !';
}
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}