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?.
Le facteur décisif pour moi est de savoir si j'appelle les colonnes de ma requête 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 = ?';
get_result()
serait mieux pour cela:// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
$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();
$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']
.
Avantages:
$row['name']
fetch()
Inconvénients:
*
Avantages:
fetch_assoc()
Inconvénients:
$row[]
Vous trouverez des exemples dans les pages de manuel respectives.
Bien que les avantages et les inconvénients soient assez simples:
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.
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
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;
}
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.
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();