Exemple d'utilisation du résultat bind vs obtenir le résultat

je voudrais voir un exemple de comment appeler à l'aide bind_result vs get_result et quel serait le but de l'utilisation de l'un sur l'autre.

aussi le pour et le contre de l'utilisation de chacun.

Quelle est la limitation d'utiliser l'un ou l'autre et y a-t-il une différence.

61
demandé sur Amirhossein Mehrvarzi 2013-09-12 04:02:14

5 réponses

le facteur décisif pour moi, est de savoir si j'appelle mes colonnes de requête en utilisant * .

en utilisant bind_result() serait mieux pour cela:

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

en utilisant get_result() serait mieux pour cela:

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

exemple 1 pour $query1 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 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 voir, vous ne pouvez pas utiliser bind_result avec * . Cependant, get_result fonctionne pour les deux, mais bind_result est plus simple et prend une partie du gâchis avec $row['name'] .


bind_result ()

Pour:

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

Inconvénients:

  • ne fonctionne pas avec la requête SQL qui utilise *

get_result ()

Pour:

  • fonctionne avec tous les énoncés SQL
  • utilise fetch_assoc()

Inconvénients:

  • doit jouer avec les variables du tableau $row[]
  • pas aussi net
  • nécessite MySQL pilote natif ( mysqlnd )
154
répondu Arian Faurtosh 2016-05-31 20:35:40

exemples que vous pouvez trouver sur les pages de manuel respectives.

alors que pour et contre sont assez simples:

  • get_result est la seule façon saine de gérer les résultats
  • pourtant, il n'est pas toujours disponible et votre code doit avoir un repli en utilisant ugly bind_result.

de toute façon, si votre idée est d'utiliser l'une ou l'autre fonction correctement dans le code de l'application - cette idée est fausse. Mais aussi longtemps que vous les avoir encapsulés dans une méthode pour retourner vos données de la requête, il n'a pas vraiment d'importance, lequel utiliser, sauf pour le fait que vous aurez besoin de dix fois plus de code pour mettre en œuvre bind_result.

2
répondu Your Common Sense 2013-09-12 06:46:59

principale différence que j'ai remarqué est que bind_result() vous donne erreur 2014 , quand vous essayez de coder imbriqué $ stmt intérieur autre $stmt , qui est d'être fetched (sans mysqli::store_result() ):

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

exemple:

  • fonction utilisée dans 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
répondu Norman Edance 2015-11-04 08:39:39

je pense que l'exemple 2 ne fonctionnera que comme ceci, parce que store_result et get_result obtiennent tous deux l'information de la table.

enlever

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

et changez un peu l'ordre. 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
répondu Coolen 2016-05-29 00:43:44

get_result() n'est désormais disponible qu'en PHP en installant le pilote MySQL native (mysqlnd). Dans certains environnements, il peut ne pas être possible ou souhaitable d'installer mysqlnd.

nonobstant, vous pouvez toujours utiliser mysqli pour faire des requêtes " select*", et obtenir les résultats avec les noms de champ - 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 à comment utiliser bind_result() au lieu de get_result() en php qui fait une simple requête " select*", et affiche les résultats (avec les noms de colonnes) dans une table HTML.

0
répondu mti2935 2017-05-23 12:34:09