(PHP 5, PHP 7, PHP 8)
mysqli::multi_query -- mysqli_multi_query — Ejecuta una o varias consultas en la base de datos
Estilo orientado a objetos
Estilo por procedimientos
Ejecuta una o varias consultas, agrupadas en el parámetro
query
mediante puntos y comas.
If the query contains any variable input then parameterized prepared statements should be used instead. Alternatively, the data must be properly formatted and all strings must be escaped using the mysqli_real_escape_string() function.
Las consultas se envían de manera asíncrona en una sola llamada a la base de datos, pero la base de datos las procesa de manera secuencial. mysqli_multi_query() espera a que la primera consulta se complete antes de devolver el control a PHP. El servidor MySQL procesará entonces la siguiente consulta en la secuencia. Una vez que el resultado esté listo, MySQL esperará a la siguiente ejecución de mysqli_next_result() desde PHP.
Se recomienda utilizar una do-while para procesar varias consultas. La conexión estará ocupada hasta que todas las consultas se completen y sus resultados sean recuperados por PHP. Ninguna otra consulta puede ser emitida en la misma conexión, hasta que todas las consultas sean procesadas. Para procesar la siguiente consulta en la secuencia, utilizar mysqli_next_result(). Si el siguiente resultado no está aún listo, mysqli esperará la respuesta desde el servidor MySQL. Para verificar si hay más resultados, utilizar mysqli_more_results().
Para las consultas que producen un conjunto de resultados, como
SELECT, SHOW, DESCRIBE
o
EXPLAIN
,
mysqli_use_result() o mysqli_store_result()
pueden ser utilizados para recuperar el conjunto de resultados. Para las consultas que
no producen un conjunto de resultados, las mismas funciones pueden ser
utilizadas para recuperar información como el número de filas afectadas.
Ejecutar una consulta CALL
para procedimientos almacenados
puede producir varios conjuntos de resultados. Si el procedimiento almacenado contiene
consultas SELECT
, los conjuntos de resultados son devueltos
en el orden en que son producidos por la ejecución del procedimiento.
En general, el llamador no puede saber cuántos conjuntos de resultados devolverá un
procedimiento y debe estar preparado para recuperar varios resultados.
El resultado final del procedimiento es un resultado de estado que no incluye
un conjunto de resultados. El estado indica si el procedimiento tuvo éxito
o si se produjo un error.
link
Sólo estilo por procediminetos: Un identificador de enlace devuelto por mysqli_connect() o mysqli_init()
query
Una string que contiene las consultas a ejecutar. Varias consultas deben estar separadas por un punto y coma.
Devuelve false
únicamente si la primera consulta falla. Para recuperar
las subsecuencias de errores provenientes de otras consultas, se debe llamar
primero a la función mysqli_next_result().
If mysqli error reporting is enabled (MYSQLI_REPORT_ERROR
) and the requested operation fails,
a warning is generated. If, in addition, the mode is set to MYSQLI_REPORT_STRICT
,
a mysqli_sql_exception is thrown instead.
Ejemplo #1 Ejemplo con mysqli::multi_query()
Estilo orientado a objetos
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Ejecución de una consulta múltiple */
$mysqli->multi_query($query);
do {
/* Almacenar el conjunto de resultados en PHP */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}
/* Imprimir divisor */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
?>
Estilo por procedimientos
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Ejecución de una consulta múltiple */
mysqli_multi_query($link, $query);
do {
/* Almacenar el conjunto de resultados en PHP */
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
/* Mostrar una separación */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
}
/* Imprimir divisor */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));
?>
El resultado de los ejemplos sería algo similar a:
my_user@localhost ----------------- Amersfoort Maastricht Dordrecht Leiden Haarlemmermeer