MySQLI_STMT :: Préparer est une méthode utilisée dans l'extension MySQLI pour prétraiter les instructions SQL. Les déclarations de prétraitement réduisent le risque d'injection SQL par rapport à l'utilisation directement des chaînes de requête SQL. En effet, lors de l'exécution de SQL, l'entrée de contenu par l'utilisateur n'est pas épissé directement dans la chaîne de requête, mais est passé sous forme de paramètre de liaison.
<span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>
Dans le code ci-dessus, la requête SQL contient deux marques de questions ( ? ), Qui sont des espaces réservés qui acceptent les paramètres de liaison ultérieurs.
Dans l'instruction de prétraitement, utilisez la méthode bind_param () pour lier la valeur d'entrée de l'utilisateur à l'espace réservé. À l'heure actuelle, la valeur du paramètre lié ne sera pas insérée directement dans l'instruction SQL, mais sera transmise par l'instruction de prétraitement. La méthode bind_param () nécessite deux paramètres: le spécificateur du type de données et la variable à limiter.
Les spécificateurs de type de données communs sont:
I : entier (int)
D : Points flottants à double précision (double)
S : String (String)
B : blob (données binaires)
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">'ss'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>);
</span></span>
Dans cet exemple, «SS» signifie que les deux paramètres liés sont des types de chaînes. Les paramètres $ nom d'utilisateur et $ mot de passe seront solidement liés aux espaces réservés de la requête SQL.
Une fois la liaison des paramètres terminée, la méthode EXECUTE () est appelée pour exécuter l'instruction de prétraitement. Si le type de paramètre lié est correct, l'instruction d'exécution s'exécutera normalement.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
La méthode EXECUTE () renvoie une valeur booléenne indiquant si l'instruction est exécutée avec succès. Si vous avez besoin d'obtenir les résultats de la requête, vous pouvez utiliser la méthode get_result () (pour SELECT QUERY) pour obtenir les résultats d'exécution.
Pour les instructions de sélection , après avoir exécuté l'instruction de prétraitement, vous devez généralement obtenir le résultat de la requête. Utilisez la méthode get_result () pour convertir les résultats de la requête en un objet mysqli_result , à partir de laquelle les données peuvent être obtenues.
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">' - '</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">'<br>'</span></span><span>;
}
</span></span>
Dans cet exemple, les résultats de la requête sont extraits par ligne et sortent le nom d'utilisateur et le courrier électronique.
Bien que les instructions de prétraitement puissent empêcher l'injection de SQL, diverses erreurs peuvent encore être rencontrées dans le développement réel. Pour un débogage efficace, nous pouvons utiliser la méthode d'erreur pour obtenir des informations d'erreur pertinentes.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Execute error: '</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error);
}
</span></span>
Ici, nous utilisons Conn-> Erreur et STMT-> Erreur pour capturer les informations d'erreur pour les instructions de connexion et d'exécution de la base de données. Cela peut nous aider à découvrir et à résoudre des problèmes en temps opportun.
Après avoir utilisé l'instruction de prétraitement, nous devons appeler la méthode Close () pour fermer l'instruction et la connexion de la base de données pour libérer la ressource.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
Ce n'est pas seulement une bonne habitude de programmation, mais évite également efficacement la fuite des ressources.
Étiquettes associées:
mysqli_stmt