(PHP 5, PHP 7, PHP 8)
mysqli::query -- mysqli_query — Выполняет запрос к базе данных
Объектно-ориентированный стиль
Процедурный стиль
$mysql
, string $query
, int $result_mode
= MYSQLI_STORE_RESULT
): mysqli_result|bool
Выполняет запрос query
к базе данных.
Если запрос содержит какие-либо входные переменные, вместо этого следует использовать подготавливаемые запросы. В качестве альтернативы данные должны быть правильно отформатированы и все строки должны быть экранированы с помощью функции mysqli_real_escape_string().
Для не DML-запросов (не INSERT, UPDATE или DELETE), эта функция равносильна вызову функции mysqli_real_query(), а затем mysqli_use_result() или mysqli_store_result().
Замечание:
В случае, если длина выражения, которое передаётся в mysqli_query(), больше, чем
max_allowed_packet
сервера, возвращаемые коды ошибки могут различаться в зависимости от используемого драйвера. А это может быть либо родной MySQL драйвер (mysqlnd
), либо клиентская библиотека MySQL (libmysqlclient
). Поведение функции будет следующим:
mysqlnd
на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означаетразмер пакета превышает.max_allowed_packet
байт
mysqlnd
на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означаетотказ сервера.
libmysqlclient
на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означаетотказ сервера.
mysql
Только для процедурного стиля: объект mysqli, полученный с помощью mysqli_connect() или mysqli_init().
query
Текст запроса.
result_mode
Режим результата может быть одной из 3 констант, указывающих, как результат будет возвращён сервером MySQL.
MYSQLI_STORE_RESULT
(по умолчанию) - возвращает объект
mysqli_result с буферизованным набором результатов.
MYSQLI_USE_RESULT
- возвращает объект
mysqli_result с небуферизованным набором результатов.
Пока есть отложенные записи, ожидающие выборки, линия соединения будет занята
и все последующие вызовы будут возвращать ошибку Commands out of sync
.
Чтобы избежать ошибки, все записи должны быть получены с сервера или набор результатов должен быть отброшен путём вызова mysqli_free_result().
MYSQLI_ASYNC
(доступно с mysqlnd) - запрос выполняется асинхронно, набор результатов сразу не возвращается.
Затем используется mysqli_poll() для получения результатов по этим запросам.
Используется в сочетании с константой
MYSQLI_STORE_RESULT
или
MYSQLI_USE_RESULT
.
Возвращает false
в случае возникновения ошибки. В случае успешного выполнения запросов,
которые создают набор результатов, таких как SELECT, SHOW, DESCRIBE
или
EXPLAIN
, mysqli_query() вернёт объект mysqli_result.
Для остальных успешных запросов mysqli_query() вернёт true
.
Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR
) и запрошенная операция не удалась,
выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT
,
вместо этого будет выброшено исключение mysqli_sql_exception.
Пример #1 Пример использования mysqli::query()
Объектно-ориентированный стиль
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Создание таблицы, не возвращает набор результатов */
$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.\n");
/* Запросы SELECT, возвращают набор результатов */
$result = $mysqli->query("SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.\n", $result->num_rows);
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);
/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
$mysqli->query("SET @a:='this will not work'");
Процедурный стиль
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* Создание таблицы, не возвращает набор результатов */
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.\n");
/* Запросы SELECT, возвращают набор результатов */
$result = mysqli_query($link, "SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.\n", mysqli_num_rows($result));
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT);
/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
mysqli_query($link, "SET @a:='this will not work'");
Результат выполнения данных примеров:
Таблица myCity создана. Запрос SELECT вернул 10 строк. Fatal error: Uncaught mysqli_sql_exception: Commands out of sync; you can't run this command now in...