mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_queryEjecuta una o varias consultas en la base de datos

Descripción

Estilo orientado a objetos

public mysqli::multi_query(string $query): bool

Estilo por procedimientos

mysqli_multi_query(mysqli $mysql, string $query): bool

Ejecuta una o varias consultas, agrupadas en el parámetro query mediante puntos y comas.

Advertencia

Security warning: SQL injection

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.

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

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.

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().

Errores/Excepciones

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.

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());
?>

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

Ver también