mysqli::multi_query
mysqli_multi_query
(PHP 5, PHP 7, PHP 8)
mysqli::multi_query -- mysqli_multi_query — Выполняет один или несколько запросов к базе данных
Описание
Объектно-ориентированный стиль
public mysqli::multi_query(string $query
): bool
mysqli_multi_query(
mysqli $mysql
,
string $query
):
bool
Запросы отправляются асинхронно за один вызов базы данных, но база данных обрабатывает их последовательно.
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
-
Строка, содержащая запросы, которые нужно выполнить.
Несколько запросов следует разделять точкой с запятой.
Внимание
Предупреждение безопасности: SQL-инъекция
Если запрос содержит какие-либо входные переменные, вместо этого следует
использовать подготавливаемые запросы.
В качестве альтернативы данные должны быть правильно отформатированы
и все строки должны быть экранированы с помощью функции mysqli_real_escape_string().
Возвращаемые значения
Возвращает 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 {
/* сохранить набор результатов в PHP */
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 {
/* сохранить набор результатов в PHP */
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