W3docs

more_results

Aprende a usar mysqli_more_results() en PHP para comprobar si hay más resultados disponibles tras ejecutar múltiples consultas SQL a la vez.

La función mysqli_more_results() comprueba si otro conjunto de resultados sigue en espera después de ejecutar varias sentencias SQL a la vez con mysqli_multi_query(). Es una pieza del pequeño conjunto de herramientas que se utiliza para recorrer los resultados de una consulta de múltiples sentencias. Este artículo explica su sintaxis, valor de retorno, el patrón de bucle al que pertenece y los errores comunes que pueden surgir.

Sintaxis

mysqli_more_results(mysqli $mysql): bool

En estilo orientado a objetos el mismo método es $mysqli->more_results().

Parámetro

  • $mysql — un objeto de conexión MySQLi devuelto por mysqli_connect() (o new mysqli(...)).

Valor de retorno

mysqli_more_results() devuelve true si uno o más conjuntos de resultados siguen disponibles de la última llamada a mysqli_multi_query(), y false si no hay más. No avanza al siguiente conjunto — para eso se llama a mysqli_next_result().

¿Cuándo se usa?

Un único mysqli_query() devuelve un solo conjunto de resultados, por lo que mysqli_more_results() no es necesario en ese caso. Solo importa con mysqli_multi_query(), que permite enviar varias sentencias separadas por ; en un solo viaje de ida y vuelta — por ejemplo, una llamada a un procedimiento almacenado que devuelve múltiples SELECTs, o un script de importación por lotes. mysqli_more_results() es la condición del bucle que indica cuándo detenerse.

El patrón de bucle estándar

Tres funciones trabajan juntas:

FunciónFunción
mysqli_more_results()¿Hay otro conjunto de resultados por venir?
mysqli_next_result()Avanza al siguiente conjunto de resultados.
mysqli_store_result()Obtiene el conjunto de resultados actual para poder leer filas.
<?php
$mysqli = mysqli_connect("localhost", "user", "pass", "demo");

mysqli_multi_query($mysqli, "SELECT 1 AS n; SELECT 2 AS n; SELECT 3 AS n;");

do {
    // Fetch the result set for the current statement.
    if ($result = mysqli_store_result($mysqli)) {
        $row = mysqli_fetch_assoc($result);
        echo "Result: {$row['n']}\n";
        mysqli_free_result($result);
    }
    // Keep going only while another set is queued AND we can advance to it.
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));

mysqli_close($mysqli);
?>

Para las tres sentencias anteriores esto imprime:

Result: 1
Result: 2
Result: 3

El do...while (no un simple while) es intencionado: el primer conjunto de resultados ya está disponible justo después de mysqli_multi_query(), por lo que debe procesarse antes de comprobar si hay más.

Errores comunes

  • Siempre combínalo con mysqli_next_result(). mysqli_more_results() solo informa del estado; nunca mueve el puntero. Llamarlo en un bucle sin mysqli_next_result() produce un bucle infinito en el primer conjunto.
  • Libera cada conjunto de resultados. Llama a mysqli_free_result() antes de avanzar, o mantendrás conjuntos de resultados adicionales en memoria.
  • Una sentencia que no devuelve filas (un INSERT, UPDATE o SELECT vacío) hace que mysqli_store_result() devuelva false — eso es normal, no un error. Comprueba mysqli_errno($mysqli) si necesitas distinguir ambos casos.

Demostración del valor de retorno sin base de datos

No necesitas un servidor activo para ver qué reporta la función. Simular la lógica con un array pequeño muestra el bucle y el booleano con claridad:

<?php
$resultSets = ["one", "two", "three"];
$index = 0;

do {
    echo "Processing: {$resultSets[$index]}\n";
    $index++;
    // more_results() is true while another set remains.
    $more = $index < count($resultSets);
    echo $more ? "more_results -> true\n" : "more_results -> false\n";
} while ($more);
?>

Salida:

Processing: one
more_results -> true
Processing: two
more_results -> true
Processing: three
more_results -> false

Funciones relacionadas

Conclusión

mysqli_more_results() es la comprobación de "¿hay más?" en el bucle de múltiples consultas. Por sí sola hace poco; combinada con mysqli_next_result() y mysqli_store_result() en un do...while, permite procesar de forma limpia cada conjunto de resultados devuelto por una única llamada a mysqli_multi_query().

Práctica

Práctica
¿Qué hace mysqli_more_results() en PHP?
¿Qué hace mysqli_more_results() en PHP?
Was this page helpful?