El factor decisivo para mí es si llamo a mis columnas de consulta usando *
.
Usar bind_result()
sería mejor para esto:
// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
Usar get_result()
sería mejor para esto:
// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
Ejemplo 1 de $query1
usobind_result()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
$stmt->bind_param('i',$id);
$stmt->execute();
$stmt->store_result();
$num_of_rows = $stmt->num_rows;
$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>';
}
$stmt->free_result();
$stmt->close();
}
$mysqli->close();
Ejemplo 2 de $query2
usoget_result()
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
$stmt->bind_param('i',$id);
$stmt->execute();
$result = $stmt->get_result();
$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>';
}
$stmt->free_result();
$stmt->close();
}
$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']
.
bind_result ()
Pros:
- Más simple
- No hay necesidad de meterse con
$row['name']
- Usos
fetch()
Contras:
- No funciona con consultas SQL que usan
*
get_result ()
Pros:
- Funciona con todas las declaraciones SQL
- Usos
fetch_assoc()
Contras:
- Debe jugar con variables de matriz
$row[]
- No tan ordenado
- requiere controlador nativo de MySQL ( mysqlnd )
$row[]
. ¡Gracias por la explicación detallada! Una advertencia; según el manual get_result () soloPuede 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.
fuente
La principal diferencia que he notado es que
bind_result()
le da un error2014
, cuando intenta codificar $ stmt anidado dentro de otro $ stmt , que se está recuperando (sinmysqli::store_result()
):Ejemplo:
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; }
fuente
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.
fuente
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();
fuente