Il m'arrive souvent de constater que des programmeurs débutants confondent bind_param() et bind_result() dans les requêtes préparées.
Voici donc un petit coup de pouce pour vous aider à bien les distinguer.
Notez que dans cette fiche, le code est adapté pour PHP 7.x. Si vous travaillez avec PHP 8.x, vous devrez y apporter quelques ajustements.
Selon la documentation PHP1, la méthodes bind_param() :
Lie des variables à une requête MySQL
On doit donc préciser un type et une valeur pour chaque point d'interrogation dans la requête SQL.
Les types disponibles sont :
Si la requête contient une variable (un point d'interrogation), peu importe le nombre de champs qu'elle va lire, elle doit préciser une valeur dans le bind_param().
$id = $_POST['id'];
...
$requete = "SELECT prenom, nomfamille FROM clients WHERE id=?";
try {
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('i', $id);
...
Si la requête contient deux variables (deux points d'interrogation), elle précisera deux valeurs.
Attention : les types (ici : 'si') sont placés un à côté de l'autre entre apostrophes ou guillemets.
$ville = strtoupper($_GET['ville']);
$annee = $_GET['annee'];
...
$requete = "SELECT id, prenom, nomfamille FROM clients WHERE UPPER(ville)=? AND EXTRACT(year FROM naissance)=? ORDER BY nomfamille, prenom";
try {
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('si', $ville, $annee);
...
La méthode bind_result(), quant à elle2 :
Lie des variables à un jeu de résultats
Cette fois, on travaille avec les champs lus par la requête SELECT.
S'il y a deux champs, il y aura deux variables dans le bind_result(). Leur but est de recevoir les valeurs lues dans la base de données.
$requete = "SELECT prenom, nomfamille FROM clients WHERE id=?";
try {
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->store_result();
if (0 == $stmt->errno) {
if ($stmt->num_rows > 0) {
$stmt->bind_result($prenom, $nomfamille);
$stmt->fetch();
echo "Bonjour, $prenom $nomfamille !";
}
...
Si la requête peut aller chercher plus d'un enregistrement, le bind_result() sera fait avant la boucle.
Dans le fond, le bind_result() dit au fetch() dans quelles variables il doit placer les informations de la ligne en cours de lecture.
$requete = "SELECT id, prenom, nomfamille FROM clients WHERE UPPER(ville)=? AND EXTRACT(year FROM naissance)=? ORDER BY nomfamille, prenom";
try {
$stmt = $mysqli->prepare($requete);
$stmt->bind_param('si', $ville, $annee);
$stmt->execute();
$stmt->store_result();
if (0 == $stmt->errno) {
if ($stmt->num_rows > 0) {
$stmt->bind_result($id, $prenom, $nomfamille);
echo '<table>';
while ($stmt->fetch()) {
echo "<tr><td><a href='detailsclient.php?id=$id'>Détails</a></td><td>$nomfamille</td><td>>$prenom</td></tr>";
}
...
bind_param() travaille avec les paramètres. Il donne une valeur aux paramètres de la requête SQL.
bind_result() travaille avec les résultats. Il reçoit les informations de chaque champ lu par la requête SQL.
1. « mysqli_stmt::bind_param ». PHP. https://www.php.net/manual/fr/mysqli-stmt.bind-param.php
2. « mysqli_stmt::bind_result ». PHP. https://www.php.net/manual/fr/mysqli-stmt.bind-result.php
▼Publicité