mysqli_query
The mysqli_query() function is used to simplify the act of performing a query against the database represented by the link parameter.
Functionally, using this function is identical to calling mysqli_real_query() followed either by mysqli_use_result() or mysqli_store_result() where query is the query string itself and resultmode is either the constant MYSQLI_USE_RESULT or MYSQLI_STORE_RESULT depending on the desired behavior. By default, if the resultmode is not provided MYSQLI_STORE_RESULT is used.
If you execute mysqli_query() with resultmode MYSQLI_USE_RESULT all subsequent calls will return error Commands out of sync unless you call mysqli_free_result() .
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. For SELECT, SHOW, DESCRIBE or EXPLAIN mysqli_query() will return a result object.
Примеры
Пример 1. Объектно-ориентированный стиль вызова
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) < printf("Connect failed: %s\n", mysqli_connect_error()); exit(); >/* Create table doesn't return a resultset */ if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) < printf("Table myCity successfully created.\n"); >/* Select queries return a resultset */ if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) < printf("Select returned %d rows.\n", $result->num_rows); /* free result set */ $result->close(); > /* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */ if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) < /* Note, that we can't execute any functions which interact with the server until result set was closed. All calls will return an 'out of sync' error */ if (!$mysqli->query("SET @a:='this will not work'")) < printf("Error: %s\n", $mysqli->error); > $result->close(); > $mysqli->close();
Пример 2. Процедурный стиль вызова
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) < printf("Connect failed: %s\n", mysqli_connect_error()); exit(); >/* Create table doesn't return a resultset */ if (mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) < printf("Table myCity successfully created.\n"); >/* Select queries return a resultset */ if ($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10")) < printf("Select returned %d rows.\n", mysqli_num_rows($result)); /* free result set */ mysqli_free_result($result); >/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */ if ($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT)) < /* Note, that we can't execute any functions which interact with the server until result set was closed. All calls will return an 'out of sync' error */ if (!mysqli_query($link, "SET @a:='this will not work'")) < printf("Error: %s\n", mysqli_error($link)); >mysqli_free_result($result); > mysqli_close($link);
Результат выполнения данного примера:
Table myCity successfully created. Select returned 10 rows. Error: Commands out of sync; You can't run this command now
Как правильно использовать mysqli
Небольшой дисклеймер от переводчика: в РНР сложилась парадоксальная ситуация. Сам язык ушёл далеко вперёд, но изучают его по жутко устаревшим материалам. Собственно, постоянный кринж от кода на Тостере (как в вопросах, так и в ответах) и побудил к переводу данной статьи.
Кроме того, переводчик, также как и вы, считает, что PDO является более продвинутым API для работы с БД, чем mysqli. Но поскольку новички в подавляющем большинстве всё равно начинают с mysqli, то нужен хотя бы один нормальный материал по этому расширению. Не можешь противостоять — возглавь!
Не говоря уже о том, что в последнее время mysqli была сильно улучшена, и из совершенно неюзабельной превратилась в довольно сносную библиотеку, в которой из принципиальных отличий от PDO осталось разве что отсутствие именованных плейсхолдеров. Так что даже (особенно) если вы учили РНР 20 лет назад и всё знаете вдоль и поперёк, то всё равно сможете найти для себя что-то новое.
Соединение
Важность кода для соединения с БД часто недооценивают, сводя к его одной-единственной строчке. В то время как правильное соединение поможет заранее решить целую кучу проблем — от кракозябр до непонятных сообщений об ошибках, и даже влияет на безопасность.
Если ваш код является обычным процедурным РНР, то вот простой пример соединения:
$host = '127.0.0.1'; $db = 'test'; $user = 'root'; $password = ''; $port = 3306; $charset = 'utf8mb4'; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db = new mysqli($host, $user, $password, $db, $port); $db->set_charset($charset); $db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
Полное объяснение всех этих команд приводится в отдельной статье, Как правильно соединяться с mysqli (en), а здесь я приведу только ключевые моменты
- устанавливая правильный режим информирования об ошибках, мы избавляемся от непонятных ошибок типа mysqli_fetch_assoc() expects parameter. / Call to a member function bind_param(). , получая вместо них актуальные сообщения об ошибках от MySQL.
- кроме того, режим исключений значительно упростит код, в котором не нужно будет писать проверку успешности выполнения каждой функции
Объектный и процедурный интерфейсы
Небольшое, но важное замечание: у mysqli есть одно уникальное свойство: каждая функция может быть вызвана как через объектный, так и через процедурный синтаксис. То есть любое действие может быть выполнено как через вызов функции, так и через обращение к методу объекта:
mysqli_query($mysqli, $query); // процедурный синтаксис $mysqli->query($query); // объектный синтаксисЕдинственное различие заключается в том, что для объектного синтаксиса мы берём параметр функции (например $mysqli ), добавляем объектный оператор ( -> ) и дальше пишем собственно имя метода, выкидывая избыточное «mysqli_». Отдельно отмечу, что вам не нужно знать ООП чтобы использовать объектный синтаксис: это просто другой способ вызвать ту же самую функцию.
Оба способа полностью взаимозаменяемы, разница только в синтаксисе. Вы можете использовать любой. Их даже можно смешивать в одном и том же коде — это будет работать, хотя и не одобряется с точки зрения стиля.
Учитывая, что объектный синтаксис является более коротким, без постоянных повторений (ср. mysqli_stmt_get_result($stmt) и $stmt->get_result() ) я настоятельно рекомендую именно его, так что именно объектный синтаксис будет использоваться в этом руководстве.
Выполнение запросов, в которых используются переменные. Подготовленные выражения
Одной из основных причин, по которым старое расширение mysql было удалено из PHP, является отсутствие поддержки подготовленных выражений, то есть переменные PHP без вариантов должны были добавляться напрямую в SQL. Но нет ни малейшей причины продолжать эту опасную практику с mysqli. Другими словами, теперь вы должны использовать подготовленные запросы, что означает полное переписывание каждой операции с БД.
Почему надо использовать подготовленные запросы? По той простой причине, что если мы добавляем данные прямо в запрос, то они могут повредить его. При этом последствия варьируются от синтаксических ошибок до SQL инъекций. В отличие от печально известного «экранирования», которое работает только для строк, и которое легко можно забыть, использовать неправильно или посчитать ненужным, подготовленные запросы позволяют нам сформулировать простую, но стопроцентно безопасную инструкцию из трёх шагов:
- Подготавливаем запрос, добавляя знаки вопроса, ? , там где раньше была переменная
- Привязываем сами переменные к этому подготовленному выражению, указывая для каждой её тип
- Выполняем запрос
Вот простой пример запроса INSERT:
$stmt = $db->prepare("INSERT INTO users (email, password) VALUES (. )"); $stmt->bind_param("ss", $email, $password_hash); $stmt->execute();Как можно видеть, тут нет ничего сложного, те самые три шага, описанные выше.
Давайте рассмотрим подготовленный запрос подробнее, на примере запроса UPDATE:
$sql = "UPDATE users SET name=?, email=?, password=? WHERE $conn->prepare($sql); $stmt->bind_param("sssi", $name, $email, $password, $id); $stmt->execute();Что здесь происходит?
$sql = "UPDATE users SET name=?, email=?, password=? WHERE >
Как это было описано выше, сначала мы заменяем все переменные запросе на вопросительные знаки.
ВАЖНО: нельзя добавлять к знакам вопроса кавычки — вы добавляете плейсхолдеры, а не строки.
$stmt= $conn->prepare($sql);Дальше мы подготавливаем запрос. Идея тут очень остроумная: для того чтобы исключить даже теоретическую возможность инъекции, сам запрос и данные для него едут на сервер по отдельности. Именно это мы здесь и видим: вызов prepare() отправляет на сервер сначала сам запрос, без данных. При этом создаётся специальная переменная $stmt , содержащая экземпляр класса mysqli_statement и дальше мы будем работать именно с ней.
$stmt->bind_param("sssi", $name, $email, $password, $id);Дальше наши переменные должны быть привязаны к подготовленному выражению. Данный вызов состоит из двух частей: сначала идёт строка, в которой перечислены типы передаваемых переменных, а затем и сами переменные. В mysqli вам необходимо указывать тип для каждой переменной. Это делается с помощью одной буквы для каждой переменной. Количество букв должно всегда соответствовать количеству переменных. Возможных типов четыре:
- i для целых чисел;
- d для чисел с плавающей запятой;
- s для строк;
- b для блобов.
И теперь вы можете сказать, что запись «sssi» означает «у нас будет 3 переменных строкового типа и одна — целочисленного». Затем в функцию передаются все переменные, 4 штуки.
Совет: MySQL с радостью принимает любые данные как строки, так что не нужно сходить с ума пытаясь найти подходящий тип для каждой переменной. Можно просто использовать «s» для всех.
$stmt->execute();И наконец, запрос выполняется. Переменные отправляются в БД и запрос выполняется.
Важно! Вы не должны проверять результат выполнения запроса вручную. В случае, если соединение было установлено, как описано выше, в случае ошибки mysqli автоматически выбросит исключение.
Чисто для комплекта, пример запроса DELETE, но я надеюсь, что вы уже уловили идею:
$sql = "DELETE FROM users WHERE $conn->prepare($sql); $stmt->bind_param("s", $id); $stmt->execute();Отправка переменных прямо в execute()
Кстати, начиная с PHP 8.1, bind_param можно не использовать, отправив вместо этого все переменные в execute() в виде массива:
$stmt = $db->prepare("INSERT INTO users (email, password) VALUES (. )"); $stmt->execute([$email, $password_hash]);В этом случае все переменные будут переданы как строки.
Mysqli_execute_query
И наконец-то, в версии 8.2 появилась великолепная функция, execute_query(), которая позволяет выполнять подготовленные запросы одной командой:
$db->execute_query("INSERT INTO users (email, password) VALUES (. )", [$email, $password_hash]);В этом случае все переменные будут так же переданы как строки.
Если у вас более старая версия РНР, здесь вы можете найти код, который добавит временную замену для этой исключительно полезной функции.
Выполнение запросов SELECT через подготовленные выражения
Точно так же как это было описано выше, мы подготавливаем запрос с вопросительными знаками, затем привязываем переменные и выполняем запрос. Однако для запросов SELECT нам понадобится один дополнительный шаг, получение переменной типа mysqli_result , которую можно будет использовать для выборки полученных строк:
$stmt = $db->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result();здесь функция get_result() возвращает экземпляр класса mysqli_result , который может использоваться для того чтобы получать возвращённые запросом строки в виде массивов или объектов.
Примечание: Если вам пишет, что такая функция не определена, то надо отметить чекбокс подписанный php_mysqlnd в разделе конфигурации PHP в панели управления вашего хостинга.
Метод execute_query() сразу возвращает mysqli_result , так что его не нужно запрашивать специально (что делает эте функцию ещё более удобной!):
$row = $db->execute_query("SELECT * FROM user WHERE email = ?", [$email])->fetch_assoc();Получение результатов запроса
Для получения результата запроса используется переменная, являющаяся экземпляром класса mysqli_result . Все функции, получающие данные из запроса, работают с этой переменной.
Стандартным способом получения как одной, так и нескольких строк, будет обращение к одной из следующих функций:
- fetch_row() которая возвращает нумерованный массив;
- fetch_assoc() которая возвращает ассоциативный массив;
- fetch_object() которая возвращает объект.
Получение одной строки
Если запрос вернул только одну строку, нам нужно обратиться к одной из вышеперечисленных функций. Например:
$stmt = $db->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $username = $row['username'];Получение нескольких строк в цикле
Что интересно, для получения нескольких строк служит та же самая функция, что и для получения одной строки. И всё благодаря одной маленькой детали: когда мы получаем строку с помощью одной из этих функций, внутренний указатель в возвращённом базой наборе строк перемещается на одну позицию, и поэтому следующее обращение к той же самой функции возвращает следующую строку — и так далее, пока строки не кончатся. Если строк больше нет, то функция fetch_* вернёт null , что позволит нам использовать цикл while для перебора всех строк:
$users = []; $sql = "SELECT * FROM users ORDER BY id DESC LIMIT 0, 10"; $result = $db->query($sql); while ($row = $result->fetch_assoc())
Здесь мы получили все полученные из БД строки в массив $users.
Подсказка: в mysqli есть удобная функция, которая сразу возвращает все строки в виде массива: mysqli_fetch_all() . Вот только по какой-то причине она по умолчанию использует fetch_row() для наполнения массива, так что если вам нужны строки в виде ассоциативных массивов, то надо использовать параметр MYSQLI_ASSOC :
$sql = "SELECT * FROM categories"; $result = $db->query($sql); $data = $result->fetch_all(MYSQLI_ASSOC);Выполнение запросов без переменных
Если запрос целиком прописан прямо в коде, то есть в нем не используются никакие переменные PHP, то для выполнения запроса можно воспользоваться функцией query() , которая, как и execute_query() , сразу возвращает объект класса mysqli_result (для запросов, которые возвращают данные), и мы можем сразу пристыковать к ней получение данных:
$menu = $db->query("SELECT * FROM menu")->fetch_all(MYSQLI_ASSOC); $count = $db->query("SELECT count(*) FROM users")->fetch_row()[0];Обработка ошибок
Обработка ошибок в запросах является очень важной темой, но её реализация вас удивит: в общем случае ошибки mysqli никак обрабатывать не нужно! Несмотря на то, что написано в бесчисленных примерах и руководствах по РНР, как правило, вы не должны писать никакого кода, обрабатывающего ошибки в запросах. Это звучит очень непривычно, но на самом деле именно так и надо делать. Если подумать, то для большинства ошибок надо только сообщить об их возникновении. И mysqli/PHP отлично справляются с этим сами, никакой помощи с вашей стороны им для этого не требуется. Следовательно, вы и не должны писать код, который проверяет результат выполнения запроса — в случае ошибки mysqli сообщит о ней автоматически, благодаря функции mysqli_report() о которой шла речь выше. Таким образом, все ошибки взаимодействия с БД будут обрабатываться единообразно, точно так же, как и все остальные ошибки РНР, что естественно является очень удобным с точки зрения обработки, которую можно выполнять в одном месте, а не разбрасывать по коду отдельно для каждого запроса. Подробнее почитать про правильный подход к обработке ошибок можно в статье Обработка ошибок в PHP (en).
В тех редких случаях, когда вам действительно надо обработать ошибку, то есть выполнить какое-то определённое действие в случае ошибки, а не просто сообщить о её появлении, запрос(ы) можно обернуть в try..catch .
Количество строк, которые вернул запрос SELECT
На самом деле нет ни одной причины использовать привычную функцию mysqli_num_rows() . Если подумать, то вы всегда можете использовать сами полученные данные для ответа на вопрос, были получены какие-то данные, или нет:
$user = $result->fetch_assoc(); if ($user) < // found! >То же самое относится и к получению нескольких строк, благодаря удобной функции mysqli_fetch_all() , которая сразу вернет все полученные строки в виде массива.
Но конечно же надо помнить, что код ни в коем случае не должен запрашивать из БД больше строк, чем требуется на одной странице. Это относится как к запросам, которые получают определенные строки из БД для последующей обработки, так и — в особенности — к запросам, которые служат только для получения количества строк. Во втором случае вместо запроса самих строк необходимо запросить только их количество, запросом SELECT count(*) . .
Количество строк, затронутых при изменении данных
В отличие от предыдущего, количество строк, затронутых запросами INSERT, UPDATE и DELETE может быть довольно полезным. Что интересно, в mysqli есть не одна, целых две возможности получить эту цифру.
Одна из них — это привычное свойство affected_rows :
$db->query("DELETE FROM users"); echo $db->affected_rows();Но есть еще одна, уникальная функция mysqli_info(), которая возвращает отдельно количество найденных и затронутых строк. Во всех других драйверах, включая PDO, вы можете получить либо то, либо другое, но не всё вместе. Хотя эта функция возвращает строку, её несложно распарсить, и получить аккуратный массив:
$db->query("update test set i=2"); $pattern = '~Rows matched: (?\d+) Changed: (?\d+) Warnings: (?\d+)~'; preg_match($pattern, $db->info, $matches); $info = array_filter($matches, "is_string", ARRAY_FILTER_USE_KEY);Mysqli query что возвращает
За выполнение запросов отвечают функции mysqli::query() , mysqli::real_query() и mysqli::multi_query() . Чаще всего применяется функция mysqli::query() , так как она выполняет сразу две задачи: выполняет запрос и буферизует на клиенте результат этого запроса (если он есть). Вызов mysqli::query() идентичен последовательному вызову функций mysqli::real_query() и mysqli::store_result() .
Пример #1 Выполнение запросов
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «example.com» , «user» , «password» , «database» );$mysqli -> query ( «DROP TABLE IF EXISTS test» );
$mysqli -> query ( «CREATE TABLE test(id INT)» );Буферизация результатов запроса
После выполнения запроса результаты можно либо получить сразу, либо считать строку за строкой с сервера. Буферизация набора результатов на стороне клиента позволяет серверу как можно раньше высвободить ресурсы, связанные с результатами запроса. Проще говоря, клиенты медленно используют наборы результатов. Поэтому рекомендуется использовать буферизованные наборы результатов. mysqli::query() объединяет выполнение запроса и буферизацию набора результатов.
PHP-приложения могут свободно оперировать данными внутри буферизованных результирующих наборов. Быстрая навигация по строкам наборов обусловлена тем, что наборы полностью располагаются в памяти клиента. Следует помнить, что зачастую обработка результатов на клиенте проще, нежели средствами сервера.
Пример #2 Навигация по строкам буферизованной результирующей таблицы
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «example.com» , «user» , «password» , «database» );$mysqli -> query ( «DROP TABLE IF EXISTS test» );
$mysqli -> query ( «CREATE TABLE test(id INT)» );
$mysqli -> query ( «INSERT INTO test(id) VALUES (1), (2), (3)» );$result = $mysqli -> query ( «SELECT id FROM test ORDER BY id ASC» );
echo «Обратный порядок. \n» ;
for ( $row_no = $result -> num_rows — 1 ; $row_no >= 0 ; $row_no —) $result -> data_seek ( $row_no );
$row = $result -> fetch_assoc ();
echo » id color: #007700″>. $row [ ‘id’ ] . «\n» ;
>echo «Исходный порядок строк. \n» ;
foreach ( $result as $row ) echo » id color: #007700″>. $row [ ‘id’ ] . «\n» ;
>Результат выполнения этого примера:
Обратный порядок. порядок строк.
Небуферизованные результирующие наборы
Если клиентские ресурсы ограничены, и в тоже время не требуется поддерживать низкую нагрузку на сервер, можно использовать не буферизованные результирующие наборы. Навигация по таким таблицам невозможна, потому что так или иначе должны быть обработаны все строки набора.
Пример #3 Навигация по строкам небуферизованной результирующей таблицы
$mysqli -> real_query ( «SELECT id FROM test ORDER BY id ASC» );
$result = $mysqli -> use_result ();?php
echo «Порядок строк в результирующем наборе. \n» ;
foreach ( $result as $row ) echo » id color: #007700″>. $row [ ‘id’ ] . «\n» ;
>Типы данных значений в результирующей таблице
Функции mysqli::query() , mysqli::real_query() и mysqli::multi_query() предназначены для выполнения не подготавливаемых запросов. На уровне протокола клиент-серверного взаимодействия MySQL за выполнение запросов отвечают команда COM_QUERY и текстовый протокол. Когда используется текстовый протокол, сервер MySQL перед отправкой клиенту преобразовывает все данные в результирующем наборе в текстовые строки. Это преобразование выполняется вне зависимости от типа данных SQL-столбца результирующей таблицы. Клиентские библиотеки mysql, в свою очередь, получают все данные, принимая их за строки. На клиенте не проводится никакого обратного преобразования к исходным типам, все данные, полученные приложением остаются PHP строками.
Пример #4 Текстовый протокол по умолчанию возвращает строки
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «example.com» , «user» , «password» , «database» );$mysqli -> query ( «DROP TABLE IF EXISTS test» );
$mysqli -> query ( «CREATE TABLE test(id INT, label CHAR(1))» );
$mysqli -> query ( «INSERT INTO test(id, label) VALUES (1, ‘a’)» );$result = $mysqli -> query ( «SELECT id, label FROM test WHERE > );
$row = $result -> fetch_assoc ();printf ( «id = %s (%s)\n» , $row [ ‘id’ ], gettype ( $row [ ‘id’ ]));
printf ( «label = %s (%s)\n» , $row [ ‘label’ ], gettype ( $row [ ‘label’ ]));Результат выполнения этого примера:
id = 1 (string) label = a (string)
Если используется библиотека mysqlnd, можно включить преобразование целочисленных значений и чисел с плавающей точкой из столбцов таблицы в PHP числа. Делается это заданием настройки подключения MYSQLI_OPT_INT_AND_FLOAT_NATIVE . В таком случае mysqlnd будет проверять метаданные столбцов и преобразовывать SQL-числа этих полей в PHP-числа, если эти значения не выходят за рамки допустимых диапазонов типов данных PHP. То есть, например, SQL INT число попадёт в PHP приложение в виде целого (integer).
Пример #5 Получение исходных типов данных в приложении
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ();
$mysqli -> options ( MYSQLI_OPT_INT_AND_FLOAT_NATIVE , 1 );
$mysqli -> real_connect ( «example.com» , «user» , «password» , «database» );$mysqli -> query ( «DROP TABLE IF EXISTS test» );
$mysqli -> query ( «CREATE TABLE test(id INT, label CHAR(1))» );
$mysqli -> query ( «INSERT INTO test(id, label) VALUES (1, ‘a’)» );$result = $mysqli -> query ( «SELECT id, label FROM test WHERE > );
$row = $result -> fetch_assoc ();printf ( «id = %s (%s)\n» , $row [ ‘id’ ], gettype ( $row [ ‘id’ ]));
printf ( «label = %s (%s)\n» , $row [ ‘label’ ], gettype ( $row [ ‘label’ ]));Результат выполнения этого примера:
id = 1 (integer) label = a (string)
Смотрите также
- mysqli::__construct()
- mysqli::options()
- mysqli::real_connect()
- mysqli::query()
- mysqli::multi_query()
- mysqli::use_result()
- mysqli::store_result()
User Contributed Notes
There are no user contributed notes for this page.
- Краткое руководство
- Процедурный и объектно-ориентированный интерфейс
- Соединения
- Выполнение запросов
- Подготавливаемые запросы
- Хранимые процедуры
- Множественные запросы
- API поддержка транзакций
- Метаданные
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Функция PHP mysqli_query ()
Функция mysqli_query () для выполнения запроса к базе данных.
грамматика
mysqli_query( connection,query,resultmode ) ;
- MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)
- MYSQLI_STORE_RESULT(默认)
технические детали
Возвращает: Для успешного SELECT, SHOW, DESCRIBE или EXPLAIN запрос будет возвращать объект mysqli_result. Для другого успешного запроса будет возвращать TRUE. Если это не удается, он возвращает FALSE. Версия PHP: 5 + Журнал обновления: Добавлены функции асинхронных запросов в PHP 5.3.0 в.