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 procedimental

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

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

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

Errores/Excepciones

Si el informe de errores de mysqli está habilitado (MYSQLI_REPORT_ERROR) y la operación solicitada falla, se genera una advertencia. Si, además, el modo está configurado como MYSQLI_REPORT_STRICT, se lanza una mysqli_sql_exception en su lugar.

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 procedimental

<?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

Ver también