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): boolEn estilo orientado a objetos el mismo método es $mysqli->more_results().
Parámetro
$mysql— un objeto de conexión MySQLi devuelto pormysqli_connect()(onew 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ón | Funció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: 3El 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 sinmysqli_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,UPDATEoSELECTvacío) hace quemysqli_store_result()devuelvafalse— eso es normal, no un error. Compruebamysqli_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 -> falseFunciones relacionadas
mysqli_multi_query()— ejecuta las múltiples sentencias en primer lugar.mysqli_next_result()— avanza al siguiente conjunto de resultados.mysqli_use_result()— una alternativa astore_result()que transmite filas en flujo.- La descripción general de la extensión MySQLi — cómo encajan todas estas funciones.
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().