Me gustaría ver un ejemplo de cómo llamar usando bind_result
vs. get_result
y cuál sería el propósito de usar uno sobre el otro.
También los pros y los contras de usar cada uno.
¿Cuál es la limitación de usar cualquiera y hay alguna diferencia?
Me gustaría ver un ejemplo de cómo llamar usando bind_result
vs. get_result
y cuál sería el propósito de usar uno sobre el otro.
También los pros y los contras de usar cada uno.
¿Cuál es la limitación de usar cualquiera y hay alguna diferencia?
Respuestas:
El factor decisivo para mí es si llamo a mis columnas de consulta usando *
.
bind_result()
sería mejor para esto:// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
get_result()
sería mejor para esto:// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
$query1
usobind_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
usoget_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();
Como puede ver, no puede usar bind_result
con *
. Sin embargo, get_result
funciona para ambos, pero bind_result
es más simple y elimina parte del lío $row['name']
.
Pros:
$row['name']
fetch()
Contras:
*
Pros:
fetch_assoc()
Contras:
$row[]
Puede encontrar ejemplos en las respectivas páginas del manual.
Si bien los pros y los contras son bastante simples:
De todos modos, si su idea es utilizar cualquiera de las funciones correctamente en el código de la aplicación, esta idea es incorrecta. Sin embargo, siempre que los tenga encapsulados en algún método para devolver sus datos de la consulta, realmente no importa cuál usar, salvo por el hecho de que necesitará diez veces más código para implementar bind_result.
La principal diferencia que he notado es que bind_result()
le da un error 2014
, cuando intenta codificar $ stmt anidado dentro de otro $ stmt , que se está recuperando (sin mysqli::store_result()
):
Preparación fallida: (2014) Comandos desincronizados; no puedes ejecutar este comando ahora
Función utilizada en el código 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;
}
}
Código 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;
}
bind_result
correctamente
$stmt->store_result()
, le permitirá hacerlo anidado $stmt
dentro de otro$stmt
mysqli_stmt::bind_result
PHP.net no me dice nada sobre mi error ... ¿O es una buena práctica de usar $stmt->store_result()
?
mysql_store_result ()
envía un conjunto de resultados grande, puede convertirse en un problema, ¿o me equivoco? Sí, para este ejemplo tal vez no sea tan importante, sin embargo ... De todos modos, gracias por corregirme :)
get_result () ahora solo está disponible en PHP mediante la instalación del controlador nativo de MySQL (mysqlnd). En algunos entornos, puede que no sea posible o deseable instalar mysqlnd.
No obstante, aún puede usar mysqli para hacer consultas 'select *' y obtener los resultados con los nombres de los campos, aunque es un poco más complicado que usar get_result () e implica usar la función call_user_func_array () de php. Vea el ejemplo en Cómo usar bind_result () en lugar de get_result () en php, que realiza una consulta simple de 'seleccionar *' y genera los resultados (con los nombres de las columnas) en una tabla HTML.
Creo que el ejemplo 2 solo funcionará así, porque store_result y get_result obtienen la información de la tabla.
Así que quita
/* Store the result (to get properties) */
$stmt->store_result();
Y cambia un poco el orden. Este es el resultado 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();
$row[]
. ¡Gracias por la explicación detallada! Una advertencia; según el manual get_result () solo