PHP Australia Conference 2015

mysqli::use_result

mysqli_use_result

(PHP 5)

mysqli::use_result -- mysqli_use_resultInicia la recuperación de un conjunto de resultados

Descripción

Estilo orientado a objetos

mysqli_result mysqli::use_result ( void )

Estilo por procedimientos

mysqli_result mysqli_use_result ( mysqli $link )

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

add a note add a note

User Contributed Notes 1 note

up
1
Anonymous
2 years ago
> 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");
}
?>
To Top