89 votes

Exemple d'utilisation de bind_result vs get_result

Je voudrais voir un exemple de la façon d'appeler en utilisant bind_result vs. get_result et quel serait l'intérêt d'utiliser l'un plutôt que l'autre.

Et les avantages et inconvénients de chacun.

Quelles sont les limites de l'utilisation de l'un ou l'autre et y a-t-il une différence ?

209voto

Arian Points 2688

Bien que les deux méthodes fonctionnent avec * les requêtes, lorsque bind_result() est utilisé, les colonnes sont généralement listées explicitement dans la requête, de sorte que l'on peut consulter la liste lors de l'attribution des valeurs retournées dans la requête. bind_result() car l'ordre des variables doit correspondre strictement à la structure de la ligne retournée.

Exemple 1 pour $query1 en utilisant bind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM `table` WHERE id = ?';
$id = 5;

$stmt = $mysqli->prepare($query1);
/*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Store the result (to get properties) */
$stmt->store_result();

/* Get the number of rows */
$num_of_rows = $stmt->num_rows;

/* Bind the result to variables */
$stmt->bind_result($id, $first_name, $last_name, $username);

while ($stmt->fetch()) {
    echo 'ID: '.$id.'<br>';
    echo 'First Name: '.$first_name.'<br>';
    echo 'Last Name: '.$last_name.'<br>';
    echo 'Username: '.$username.'<br><br>';
}

Exemple 2 pour $query2 en utilisant get_result()

$query2 = 'SELECT * FROM `table` WHERE id = ?'; 
$id = 5;

$stmt = $mysqli->prepare($query2);
/*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Get the result */
$result = $stmt->get_result();

/* Get the number of rows */
$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {
    echo 'ID: '.$row['id'].'<br>';
    echo 'First Name: '.$row['first_name'].'<br>';
    echo 'Last Name: '.$row['last_name'].'<br>';
    echo 'Username: '.$row['username'].'<br><br>';
}

bind_result()

Pour :

  • Fonctionne avec les versions obsolètes de PHP
  • Retourne des variables séparées

Cons :

  • Toutes les variables doivent être listées manuellement
  • Nécessite plus de code pour retourner la ligne en tant que tableau.
  • Le code doit être mis à jour chaque fois que la structure de la table est modifiée.

get_result()

Pour :

  • Renvoie un tableau ou un objet associatif/énuméré, automatiquement rempli avec les données de la ligne renvoyée.
  • Permet d'accéder à fetch_all() pour retourner toutes les lignes retournées en une seule fois

Cons :

  • nécessite le pilote natif de MySQL ( mysqlnd )

3voto

Vous trouverez des exemples dans les pages des manuels respectifs, get_result() y bind_result() .

Bien que les avantages et les inconvénients soient assez simples :

  • get_result() est la seule façon saine de gérer les résultats
  • mais il se peut qu'il ne soit pas toujours disponible sur certaines versions de PHP obsolètes et non prises en charge.

Dans une application web moderne, les données ne sont jamais affichées dès la requête. Les données doivent d'abord être collectées et ce n'est qu'ensuite que l'affichage doit être lancé. Ou même si vous ne suivez pas les meilleures pratiques, il y a des cas où les données doivent être retournées et non imprimées immédiatement.

En gardant cela à l'esprit, voyons comment écrire un code qui renvoie les données sélectionnées comme un tableau imbriqué de tableaux associatifs en utilisant les deux méthodes.

bind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM `table` WHERE id = ?';
$stmt = $mysqli->prepare($query1);
$stmt->bind_param('s',$id);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($id, $first_name, $last_name, $username);
$rows = [];
while ($stmt->fetch()) {
    $rows[] = [
        'id' => $id,
        'first_name' => $first_name,
        'last_name' => $last_name,
        'username' => $username,
    ];
}

et n'oubliez pas de modifier ce code à chaque fois qu'une colonne est ajoutée ou supprimée du tableau.

get_result()

$query2 = 'SELECT * FROM `table` WHERE id = ?';
$stmt = $mysqli->prepare($query2);
$stmt->bind_param('s', $id);
$stmt->execute();
$rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

et ce code reste le même lorsque la structure de la table est modifiée.

Et ce n'est pas tout.
Dans le cas où vous décidez d'automatiser la routine ennuyeuse de préparation/liaison/exécution dans une fonction soignée qui serait appelée comme ceci

$query = 'SELECT * FROM `table` WHERE id = ?';
$rows = prepared_select($query, [$id])->fetch_all(MYSQLI_ASSOC);

avec get_result() ce sera une tâche tout à fait plausible, une question de quelques lignes . Mais avec bind_param() ce sera une quête fastidieuse.

C'est pourquoi j'appelle le bind_result() méthode "laide".

2voto

mti2935 Points 2753

get_result() est uniquement disponible en PHP en installant le pilote natif de MySQL (mysqlnd). Dans certains environnements, il n'est pas possible ou souhaitable d'installer mysqlnd.

Néanmoins, vous pouvez toujours utiliser mysqli pour faire SELECT * et obtenir les résultats avec les noms des champs - bien que cela soit légèrement plus compliqué que d'utiliser get_result() et implique l'utilisation de la fonction call_user_func_array() fonction. Voir l'exemple à Comment utiliser bind_result() au lieu de get_result() en php ? qui fait un simple SELECT * et envoie les résultats (avec les noms des colonnes) dans un tableau HTML.

0voto

Norman Edance Points 79

La principale différence que j'ai remarquée est que bind_result() vous donne l'erreur 2014 lorsque vous essayez de coder des éléments imbriqués $stmt à l'intérieur d'un autre $stmt qui est en train d'être récupéré (sans mysqli::store_result() ):

Prepare failed : (2014) Les commandes ne sont pas synchronisées ; vous ne pouvez pas exécuter cette commande maintenant.

Exemple :

  • Fonction utilisée dans le code principal.

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
  • Code principal.

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X