Modérateur PHPfrance |
10684 Messages
19 mai 2021, 15:09
Hello !
Les requêtes préparées permettent de définir une structure SQL de base comportant des balises qui peuvent être remplacées dynamiquement par des valeurs pour enchainer les exécutions (et par exemple charger un grand nombre d'enregistrements dans une table en passant uniquement les valeurs de l'enregistrement suivant sans que le moteur n'ait besoin de procéder à la préparation de la requête à chaque fois).
Une requête préparée n'a en théorie aucun intérêt pour effectuer un select (s'il y a besoin d'exécuter un grand nombre de select consécutifs, c'est qu'il y a sans doute un problème de conception). Pour autant, elles ont un avantage et c'est ce qui pousse généralement les dev à s'en servir, c'est que les variables utilisées sont formatées et protégées par défaut lors de l'exécution.
On prépare donc une requête ainsi mysqli_prepare($link, "SELECT District FROM City WHERE Name=?"), sachant que le ? sera remplacé lors de l'exécution par la valeur "bindée", c'est à dire passée en paramètre lors de l'exécution. S'il s'agit d'une chaine de caractères, les apostrophes qui la délimitent seront ajoutés, et les caractères spéciaux éventuels qu'elle contient seront protégés.
L'instruction mysqli_stmt_bind_param($stmt, "s", $city), permet d'utiliser la valeur contenue dans la variable $city lors de l'exécution, en précisant qu'il s'agit d'un type string. Tu peux ensuite exécuter la requête et en récupérer le résultat afin de lire les enregistrements retournés.
Dans l'exemple ci-dessus, l'instruction mysqli_stmt_bind_result($stmt, $district); est utilisée afin de lier la variable $district au jeu de résultats de la requête. Sans cela, il n'y a aucun lien direct entre la variable $district et la colonne District de la table City. Mais tu pourrais tout aussi bien utiliser les méthodes fetch_assoc() ou fetch_row() pour récupérer les enregistrements et les parcourir

Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...