> One should not use mysqli_use_result() if a lot of processing on the client side is performed, since this will tie up the server and prevent other threads from updating any tables from which the data is being fetched.
Another way of understanding the "blocking" behavior of this "use_result" method is that by using this method (or the MYSQLI_USE_RESULT flag on the "query" method), if attempting to run a second query of any kind - updates, inserts, selects, or other - while still working with these first results, the second query will fail. Checking mysqli->error, you should get a "Commands out of sync" error on the second query call.
However, if you use the "store_result" method (or the default MYSQLI_STORE_RESULT flag on the "query" method) instead, the second query will execute just fine.
Just to demonstrate this "blocking" behavior of this "use_result" method, the second query on line 7 below would otherwise fail if you instead used "use_result" on line 3:
<?php
$mysqli->real_query('SELECT * FROM `test`');
$query = $mysqli->store_result();
while ($row = $query->fetch_assoc()) {
$id = (int) $row['id'];
$query2 = $mysqli->query("UPDATE `test` SET `label` = md5(rand()) WHERE `id` = $id");
}
?>
mysqli::use_result
mysqli_use_result
(PHP 5)
mysqli::use_result -- mysqli_use_result — Inicia la resuperación de un conjunto de resultados
Descripción
Estilo orientado a objetos
Estilo por procedimientos
Usada par iniciar la recuperación de un conjunto de resultados de la última consulta ejecutada usando la función mysqli_real_query() sobre la conexión a la base de datos.
Se debe llamar a esta función o a mysqli_store_result() antes de que los resultados de una consulta puedan ser recuperados, y una o la otra debe llamarse para prevenir que falle la siguiente consulta en esa conexión a la base de datos.
Nota:
La función mysqli_use_result() no transfiere el conjunto de resultados por completo desde la base de datos y por lo tanto no se pueden usar funciones como mysqli_data_seek() para mover una fila en particular dentro del conjunto. Para usar esta funcionalidad, el conjunto de resultados debe ser almacenado usando mysqli_store_result(). No se debería usar mysqli_use_result() si se realizan muchos procesos en el lado del cliente, ya que ocupará el servidor e impedirá que otros hilos actualicen cualquier table desde la cuales se están obteniendo los datos.
Valores devueltos
Devuelve un objeto de resultados no almacenado en buffer o FALSE si ocurrió un error.
Ejemplos
Ejemplo #1 Ejemplo de mysqli::use_result()
Estilo orientado a objetos
<?php
$mysqli = new mysqli("localhost", "mi_usuario", "mi_contraseña", "world");
/* Comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$consulta = "SELECT CURRENT_USER();";
$consulta .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* ejecutar una multi consulta */
if ($mysqli->multi_query($consulta)) {
do {
/* primero almacenar el conjunto de resultados */
if ($resultado = $mysqli->use_result()) {
while ($fila = $resultado->fetch_row()) {
printf("%s\n", $fila[0]);
}
$resultado->close();
}
/* imprimir un separador */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
Estilo por procedimientos
<?php
$enlace = mysqli_connect("localhost", "mi_usuario", "mi_contraseña", "world");
/* Comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$consulta = "SELECT CURRENT_USER();";
$consulta .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* ejecutar una multi consulta */
if (mysqli_multi_query($enlace, $consulta)) {
do {
/* primero almacenar el conjunto de resultados */
if ($resultado = mysqli_use_result($enlace)) {
while ($fila = mysqli_fetch_row($resultado)) {
printf("%s\n", $fila[0]);
}
mysqli_free_result($resultado);
}
/* imprimir un separador */
if (mysqli_more_results($enlace)) {
printf("-----------------\n");
}
} while (mysqli_next_result($enlace));
}
/* close connection */
mysqli_close($enlace);
?>
El resultado de los ejemplos serían:
mi_usuario@localhost ----------------- Amersfoort Maastricht Dordrecht Leiden Haarlemmermeer
Ver también
- mysqli_real_query() - Ejecuta una consulta SQL
- mysqli_store_result() - Transfiere un conjunto de resulados de la última consulta
