Pour travailler avec les requêtes préparées, il y a un certain ordre à suivre :
- préparer la requête ;
- lier les variables à la requête ;
- exécuter la requête ;
- si la requête renvoie un résultat, on continue : lier le résultat à des variables ;
- fetcher le résultat.
Quasiment toutes les fonctions concernant les requêtes préparées commenceront par
mysqli_stmt_.
Préparer la requête
On prépare la requête avec cette fonction :
Code : PHP | <?php
$req_pre = mysqli_prepare($bdd, 'SELECT * FROM membres WHERE id = ?');
?>
|
$req_pre est une variable qui contient la requête préparée. À part ça, vous n'avez pas vraiment besoin d'explications.
Lier les variables à la requête préparée
On les lie avec cette fonction un peu plus complexe :
Code : PHP | <?php
mysqli_stmt_bind_param($req_pre, "i", $id);
?>
|
Cette fonction est en effet un peu particulière.
$req_pre est la variable de la requête préparée.
i est le type de la variable qui suit. La variable coorespond à ce qui va remplacer le point d'interrogation dans la requête.
Concernant les types de variables possibles, voici un petit tableau :
| Lettre | Correspond à |
|---|
| i |
un nombre entier |
| d |
un nombre décimal |
| s |
une chaîne de caractères |
Ces lettres doivent être placées selon l’ordre dans lequel apparaissent les variables après, tel que les variables doivent apparaître dans l'ordre des points d'interrogation dans la requête. Les lettres doivent être dans le même paramètre.
Un exemple vaut mieux qu'un long discours :
Code : PHP | <?php
$req_pre = mysqli_prepare($bdd, 'INSERT INTO membres (pseudo, age, poids) VALUES ( ?, ?, ?)');
mysqli_stmt_bind_param($req_pre, "sid", $pseudo, $age, $poids);
?>
|
Disons que
$pseudo vaut
quelquun, que
$age vaut
23 et que
$poid vaut
52,357 (par exemple, hein

).
Exécuter la requête
Rien de bien sorcier :
Code : PHP | <?php
mysqli_stmt_execute($req_pre);
?>
|
(Sans commentaires.)
Si la requête ne renvoie pas de résultat (les requêtes d'insertion, de mise à jour, de suppression), on s'arrête là. Sinon, il faut lier le résultat de l'exécution à des variables.
Lier le résultat à des variables
Personnellement, je lie le résultat d'une requête préparée à un tableau dont chacun aura le nom de la colonne du résultat. Vous allez vite comprendre :
Code : PHP | <?php
mysqli_stmt_bind_result($req_pre, $donnees['pseudo'], $donnees['age'], $donnees['email']);
?>
|
Voilà, si vous choisissez de tout sélectionner dans la requête, vous aurez une variable par colonne de la base. Si vous avez sélectionné les colonnes que vous souhaitez obtenir dans la requête, il faudra une variable par colonne demandée.
Fetcher le résultat
Si vous savez qu'il n'y aura qu'un résultat, il faut
fetcher de cette façon :
Code : PHP | <?php
mysqli_stmt_fetch($req_pre);
?>
|
Et seulement ensuite vous pourrez utiliser le tableau
$donnees.
S'il y aura plusieurs résultats, il faut faire une boucle :
Code : PHP | <?php
while(mysqli_stmt_fetch($req_pre))
{
echo $donnees['pseudo'] . ", " . $donnees['age'] . " ans," . $donnees['email'];
}
?>
|
Exemples
Avec une requête qui ne renvoie pas de résultat
Code : PHP | <?php
// include de la connexion SQL.
$req_pre = mysqli_prepare($bdd, 'INSERT INTO membres (pseudo, age, email) VALUES (?, ?, ?)');
mysqli_stmt_bind_param($req_pre, "sis", $pseudo, $age, $email);
mysqli_stmt_execute($req_pre);
?>
|
Avec une requête qui renvoie des résultats
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
// include de la connexion SQL.
$req_pre = mysqli_prepare($bdd, 'SELECT * FROM membres WHERE age = ? LIMIT 0, ?');
mysqli_stmt_bind_param($req_pre, "ii", $age, $nombre_resultat);
mysqli_stmt_execute($req_pre);
mysqli_stmt_bind_result($req_pre, $donnees['pseudo'], $donnees['age'], $donnees['email']);
while(mysqli_stmt_fetch($req_pre))
{
echo $donnees['pseudo'] . ", " . $donnees['age'] . " ans, " . $donnees['email'];
}
?>
|
Dans l'exemple ci-dessus, pseudo, age et email sont les seules colonnes de ma table.
Si j'avais demandé dans la requête SQL seulement pseudo et email j'aurais lié le résultat seulement à $donnees['pseudo'] et $donnees['email'], dans l'ordre que je les ai indiqués dans la requête.