mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_queryВыполняет один или несколько запросов к базе данных

Описание

Объектно-ориентированный стиль

publicmysqli::multi_query(string$query): bool

Процедурный стиль

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

Запускает на выполнение один или несколько запросов, перечисленных через точку с запятой.

Внимание

Предупреждение безопасности: SQL-инъекция

Вместо составления строки запроса с включением переменных значений необходимо подготавливать запросы. Либо строки запроса должны быть экранированы функцией mysqli_real_escape_string() и правильно отформатированы.

Запросы отправляются асинхронно за один вызов базы данных, но база данных обрабатывает их последовательно. mysqli_multi_query() ожидает завершения первого запроса, прежде чем вернуть управление PHP. Затем сервер MySQL обработает следующий запрос в последовательности. Как только следующий результат будет готов, MySQL будет ждать следующего выполнения mysqli_next_result() из PHP.

Для обработки нескольких запросов рекомендуется использовать do-while. Соединение будет занято до тех пор, пока все запросы не будут завершены и их результаты не будут загружены в PHP. Никакой другой оператор не может быть выдан в том же соединении, пока не будут обработаны все запросы. Чтобы перейти к следующему запросу в последовательности, используйте mysqli_next_result(). Если следующий результат ещё не готов, mysqli будет ждать ответа от сервера MySQL. Чтобы проверить, есть ли ещё результаты, используйте mysqli_more_results().

Для запросов, которые производят набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, mysqli_use_result() или mysqli_store_result() может использоваться для получения набора результатов. Для запросов, которые не производят набор результатов, те же функции могут использоваться для получения информации, такой как количество затронутых строк.

Подсказка

Выполнение запросов CALL для хранимых процедур может дать несколько наборов результатов. Если хранимая процедура содержит запросы SELECT, наборы результатов возвращаются в том порядке, в котором они создаются при выполнении процедуры. В общем, вызывающая функция не может знать, сколько наборов результатов вернёт процедура, и должна быть готова получить несколько результатов. Конечный результат процедуры - это результат статуса, который не включает набор результатов. Статус показывает, была ли процедура успешной или произошла ошибка.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect() или функция mysqli_init().

query

Строка, содержащая запросы, которые нужно выполнить. Несколько запросов следует разделять точкой с запятой.

Возвращаемые значения

Возвращает false, если первое выражение вызвало ошибку. Чтобы получить доступ к ошибкам остальных подзапросов, нужно сначала вызвать функцию mysqli_next_result().

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::multi_query()

Объектно-ориентированный стиль

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


$mysqli->multi_query($query);
do {

if ($result = $mysqli->store_result()) {
while (
$row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}

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";


mysqli_multi_query($link, $query);
do {

if ($result = mysqli_store_result($link)) {
while (
$row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
}

if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (
mysqli_next_result($link));

Вывод приведённых примеров будет похож на:

my_user@localhost ----------------- Amersfoort Maastricht Dordrecht Leiden Haarlemmermeer

Смотрите также

  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_next_result() - Подготовка следующего доступного результирующего набора из multi_query
  • mysqli_more_results() - Проверка, есть ли ещё результаты в мультизапросе
To Top