Easy-Micro

ESPACEMEMBRE SQL
Requêtes préparées

Requêtes préparées

Formation MySQL par Easy-Micro 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';
Exemple sans paramètre
PREPARE select_race
FROM 'SELECT * FROM Race';
Le nom de la requête préparée ne doit pas être entre guillemets
Exemple avec un paramètre (le ?)
PREPARE select_client
FROM 'SELECT * FROM Client WHERE email = ?';
Avec deux paramètres (les ?)
PREPARE select_adoption
FROM 'SELECT * FROM Adoption WHERE client_id = ? AND animal_id = ?';
La chaîne de caractères contenant la requête à préparer ne peut contenir qu'une seule requête

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.

Formation MySQL par Easy-Micro 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 utilisateur
SET @req = 'SELECT * FROM Race';
PREPARE select_race
FROM @req;
Autre exemple de requête préparée avec variable utilisateur
SET @colonne = 'nom';
SET @req_animal = CONCAT('SELECT ', @colonne, ' FROM Animal WHERE id = ?');
PREPARE select_col_animal
FROM @req_animal;
Attention, il n'est pas possible de mettre directement la fonction CONCAT() dans la clause FROM

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, ...];

Exemples
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;

Formation MySQL par Easy-Micro 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());
}

< Page précédente SQL