web-dev-qa-db-fra.com

Exemple d'utilisation de bind_result vs get_result

Je voudrais voir un exemple de la façon d'appeler en utilisant bind_result contre. get_result et quel serait le but d'utiliser l'un sur l'autre.

Aussi les avantages et les inconvénients de l'utilisation de chacun.

Quelle est la limite d'utilisation de l'un ou de l'autre et y a-t-il une différence?.

72
Arian Faurtosh

Le facteur décisif pour moi est de savoir si j'appelle les colonnes de ma requête en utilisant *.

Utiliser bind_result() serait mieux pour cela:

// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';

Utiliser get_result() serait mieux pour cela:

// Use get_result() with fetch_assoc() 
$query2 = 'SELECT * FROM table WHERE id = ?';

Exemple 1 pour $query1 En utilisant bind_result()

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

if($stmt = $mysqli->prepare($query)){
   /*
        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>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Exemple 2 pour $query2 En utilisant get_result()

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

if($stmt = $mysqli->prepare($query)){
   /*
        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>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Comme vous pouvez le constater, vous ne pouvez pas utiliser bind_result Avec *. Cependant, get_result Fonctionne pour les deux, mais bind_result Est plus simple et élimine les inconvénients avec $row['name'].


bind_result ()

Avantages:

  • Plus simple
  • Pas besoin de jouer avec $row['name']
  • Utilise fetch()

Inconvénients:

  • Ne fonctionne pas avec les requêtes SQL utilisant *

get_result ()

Avantages:

  • Fonctionne avec toutes les instructions SQL
  • Utilise fetch_assoc()

Inconvénients:

  • Doit déconner avec les variables du tableau $row[]
  • Pas aussi bien
  • nécessite un pilote natif MySQL ( mysqlnd )
170
Arian Faurtosh

Vous trouverez des exemples dans les pages de manuel respectives.

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

  • get_result est le seul moyen sain de gérer les résultats
  • pourtant, il n'est pas toujours disponible et votre code doit avoir une solution de secours en utilisant laid bind_result.

Quoi qu'il en soit, si votre idée est d'utiliser l'une ou l'autre fonction directement dans le code de l'application, cette idée est fausse. Cependant, tant que vous les avez encapsulées dans une méthode pour renvoyer vos données à partir de la requête, peu importe la méthode à utiliser, à part le fait qu'il vous faudra dix fois plus de code pour implémenter bind_result.

2
Your Common Sense

La principale différence que j'ai remarquée est que bind_result() vous donne une erreur 2014 Lorsque vous essayez de coder avec un code imbriqué $ stmt dans d'autres $ stmt, c'est-à-dire - récupéré (sans mysqli::store_result()):

La préparation a échoué: (2014) Commandes dé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;
    }
    
1
Norman Edance

get_result () est maintenant disponible uniquement dans PHP en installant le pilote natif MySQL (mysqlnd). Dans certains environnements, il peut ne pas être possible ou souhaitable d'installer mysqlnd.

Néanmoins, vous pouvez toujours utiliser mysqli pour faire les requêtes 'select *', et obtenir les résultats avec les noms de champs - bien que ce soit légèrement plus compliqué que d'utiliser get_result (), et implique l'utilisation de la fonction call_user_func_array () de php. Voir l'exemple à la page suivante Comment utiliser bind_result () au lieu de get_result () dans php qui effectue une simple requête 'select *' et affiche les résultats (avec les noms de colonne) dans un tableau HTML.

0
mti2935

Je pense que l'exemple 2 ne fonctionnera que comme cela, car store_result et get_result obtiennent toutes les informations de la table.

Alors enlève

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

Et changez l'ordre un peu. C'est le résultat final:

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

if($stmt = $mysqli->prepare($query)){
 /*
    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>';
}

/* free results */
$stmt->free_result();
0
Coolen