Метод query в php
За выполнение запросов отвечают функции 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_query
Для не-DML запросов (не INSERT, UPDATE или DELETE), эта функция равносильна вызову функции mysqli_real_query() , а затем mysqli_use_result() или mysqli_store_result() .
- mysqlnd на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означает » размер пакета превышает max_allowed_packet байт «.
- mysqlnd на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означает » отказ сервера «.
- libmysqlclient на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означает » отказ сервера «.
Список параметров
Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()
Данные в тексте запроса должны быть правильно экранированы.
Либо константа MYSQLI_USE_RESULT , либо MYSQLI_STORE_RESULT в зависимости от требуемого поведения функции. По умолчанию используется MYSQLI_STORE_RESULT .
При использовании MYSQLI_USE_RESULT все последующие вызовы этой функции будут возвращать ошибку Commands out of sync до тех пор, пока не будет вызвана функция mysqli_free_result()
С константой MYSQLI_ASYNC (доступна при использовании mysqlnd) возможно выполнять запросы асинхронно. В этом случае для получения результатов каждого запроса необходимо использовать функцию mysqli_poll() .
Возвращаемые значения
Возвращает FALSE в случае неудачи. В случае успешного выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернет объект mysqli_result. Для остальных успешных запросов mysqli_query() вернет TRUE .
Список изменений
Версия | Описание |
---|---|
5.3.0 | Добавлена возможность выполнять асинхронные запросы. |
Примеры
Пример #1 Пример использования mysqli::query()
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );
?php
/* проверка соединения */
if ( $mysqli -> connect_errno ) printf ( «Не удалось подключиться: %s\n» , $mysqli -> connect_error );
exit();
>
/* Создание таблицы не возвращает результирующего набора */
if ( $mysqli -> query ( «CREATE TEMPORARY TABLE myCity LIKE City» ) === TRUE ) printf ( «Таблица myCity успешно создана.\n» );
>
/* Select запросы возвращают результирующий набор */
if ( $result = $mysqli -> query ( «SELECT Name FROM City LIMIT 10» )) printf ( «Select вернул %d строк.\n» , $result -> num_rows );
/* очищаем результирующий набор */
$result -> close ();
>
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
if ( $result = $mysqli -> query ( «SELECT * FROM City» , MYSQLI_USE_RESULT ))
/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем результирующий набор. Все подобные вызовы
будут вызывать ошибку ‘out of sync’ */
if (! $mysqli -> query ( «SET @a:=’this will not work'» )) printf ( «Ошибка: %s\n» , $mysqli -> error );
>
$result -> close ();
>
$link = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );
?php
/* проверка соединения */
if ( mysqli_connect_errno ()) printf ( «Не удалось подключиться: %s\n» , mysqli_connect_error ());
exit();
>
/* Создание таблицы не возвращает результирующего набора */
if ( mysqli_query ( $link , «CREATE TEMPORARY TABLE myCity LIKE City» ) === TRUE ) printf ( «Таблица myCity успешно создана.\n» );
>
/* Select запросы возвращают результирующий набор */
if ( $result = mysqli_query ( $link , «SELECT Name FROM City LIMIT 10» )) printf ( «Select вернул %d строк.\n» , mysqli_num_rows ( $result ));
/* очищаем результирующий набор */
mysqli_free_result ( $result );
>
/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
if ( $result = mysqli_query ( $link , «SELECT * FROM City» , MYSQLI_USE_RESULT ))
/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем результирующий набор. Все подобные вызовы
будут вызывать ошибку ‘out of sync’ */
if (! mysqli_query ( $link , «SET @a:=’this will not work'» )) printf ( «Ошибка: %s\n» , mysqli_error ( $link ));
>
mysqli_free_result ( $result );
>
Результат выполнения данных примеров:
Таблица myCity успешно создана. Select вернул 10 строк. Ошибка: Commands out of sync; You can't run this command now
Смотрите также
- mysqli_real_query() — Выполнение SQL запроса
- mysqli_multi_query() — Выполняет запрос к базе данных
- mysqli_free_result() — Освобождает память занятую результатами запроса
PDO::query
PDO::query() prepares and executes an SQL statement in a single function call, returning the statement as a PDOStatement object.
For a query that you need to issue multiple times, you will realize better performance if you prepare a PDOStatement object using PDO::prepare() and issue the statement with multiple calls to PDOStatement::execute() .
If you do not fetch all of the data in a result set before issuing your next call to PDO::query() , your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query() .
Note:
If the query contains placeholders, the statement must be prepared and executed separately using PDO::prepare() and PDOStatement::execute() methods.
Parameters
The SQL statement to prepare and execute.
If the SQL contains placeholders, PDO::prepare() and PDOStatement::execute() must be used instead. Alternatively, the SQL can be prepared manually before calling PDO::query() , with the data properly formatted using PDO::quote() if the driver supports it.
The default fetch mode for the returned PDOStatement . It must be one of the PDO::FETCH_* constants.
If this argument is passed to the function, the remaining arguments will be treated as though PDOStatement::setFetchMode() was called on the resultant statement object. The subsequent arguments vary depending on the selected fetch mode.
Return Values
Returns a PDOStatement object or false on failure.
Errors/Exceptions
Emits an error with level E_WARNING if the attribute PDO::ATTR_ERRMODE is set to PDO::ERRMODE_WARNING .
Throws a PDOException if the attribute PDO::ATTR_ERRMODE is set to PDO::ERRMODE_EXCEPTION .
Examples
Example #1 SQL with no placeholders can be executed using PDO::query()
$sql = ‘SELECT name, color, calories FROM fruit ORDER BY name’ ;
foreach ( $conn -> query ( $sql ) as $row ) print $row [ ‘name’ ] . «\t» ;
print $row [ ‘color’ ] . «\t» ;
print $row [ ‘calories’ ] . «\n» ;
>
?>?php
The above example will output:
apple red 150 banana yellow 250 kiwi brown 75 lemon yellow 25 orange orange 300 pear green 150 watermelon pink 90
See Also
- PDO::exec() — Execute an SQL statement and return the number of affected rows
- PDO::prepare() — Prepares a statement for execution and returns a statement object
- PDOStatement::execute() — Executes a prepared statement