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

31.5 bind_param() vs bind_result()


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.

bind_param()

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 :

  • string (s)
  • integer (i)
  • decimal (d)
  • blob (b)

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().

PHP 8.x

$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.

PHP 8.x

$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);
    ...

bind_result()

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.

PHP 8.x

$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.

PHP 8.x

$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>";
            }

            ...

En résumé

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.

Sources

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é

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