Formation PUB010 : PHP, 2025 Écrire du code PHP sécurisé

31.6 Comment choisir entre $mysqli->prepare() et $mysqli->query()


L'utilisation des requêtes préparées, avec $mysqli->prepare(), est une nécessité pour mieux se protéger contre les injections SQL. Cependant, elle demande plus d'étapes avant que la requête soit effectivement effectuée et ce, autant en terme de lignes de code à ajouter à votre programme que de lignes de codes exécutées par la fonction.

Selon la documentation officielle de PHP :

L'utilisation de requête préparée n'est pas toujours la façon la plus efficace d'exécuter une requête. Une requête préparée exécutée une seule fois provoque plus d'aller-retour client-serveur qu'une requête non préparée.

Il peut cependant y avoir un avantage au niveau des performances lorsqu'une requête préparée est exécutée plusieurs fois, même si les paramètres diffèrent. Toujours selon la documentation officielle de PHP :

Une requête préparée peut être exécutée à plusieurs reprises. A chaque exécution, la valeur courante de la variable liée est évaluée, et envoyée au serveur. La requête n'est pas analysée de nouveau. Le template de requête n'est pas une nouvelle fois envoyée au serveur non plus.

À partir de ce constat, voici l'approche à prendre lorsqu'une requête n'est pas exécutée en boucle :

De façon générale, on utilisera les requêtes préparées seulement lorsque la requête contient des paramètres (des variables), peu importe la provenance de ces paramètres.

PHP 8.x

$requete = "SELECT id, prenom, nomfamille FROM clients ORDER BY nomfamille, prenom";

try {

    $resultat = $mysqli->query($requete);     // inutile d'utiliser les requêtes préparées puisqu'il n'y a aucun paramètre dans la requête

    ...

PHP 8.x

$requete = "SELECT prenom, nomfamille FROM clients WHERE client_id=?";

try {

    $stmt = $mysqli->prepare($requete);   // on utiliser une requête préparée puisque la requête contient un paramètre

    ...

Pour plus d'information

« Les requêtes préparées ». PHP. http://php.net/manual/fr/mysqli.quickstart.prepared-statements.php

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre