mysqli::multi_query
mysqli_multi_query
(PHP 5, PHP 7, PHP 8)
mysqli::multi_query -- mysqli_multi_query — Ejecuta una o varias consultas en la base de datos
Descripción
Estilo orientado a objetos
Advertencia
Advertencia de seguridad: Inyección SQL
Si la consulta contiene alguna entrada de variable,
entonces se deben usar sentencias preparadas
parametrizadas en su lugar. Alternativamente, los datos deben estar correctamente formateados y todas las cadenas deben ser escapadas usando
la función mysqli_real_escape_string().
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.
Sugerencia
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.
Parámetros
-
mysql
Solo estilo procedimental: Un objeto mysqli
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.
Valores devueltos
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().
Ejemplos
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());
?>
<?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));
?>
Los ejemplos anteriores mostrarán algo similar a :
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer