Statement on glibc/iconv Vulnerability

mysqli::execute_query

mysqli_execute_query

(PHP 8 >= 8.2.0)

mysqli::execute_query -- mysqli_execute_queryПодготавливает, связывает параметры и выполняет SQL-запрос

Описание

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

public mysqli::execute_query(string $query, ?array $params = null): mysqli_result|bool

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

mysqli_execute_query(mysqli $mysql, string $query, ?array $params = null): mysqli_result|bool

Подготавливает SQL-запрос, связывает параметры и выполняет его. Метод mysqli::execute_query() является сокращением для mysqli::prepare(), mysqli_stmt::bind_param(), mysqli_stmt::execute() и mysqli_stmt::get_result().

У шаблона запроса может быть ноль или более маркеров параметров со знаком вопроса (?), которые также называются заполнителями. Значения параметров должны быть представлены в виде массива (array), переданного в параметр params.

Подготовленный запрос создаётся под капотом, но он никогда не выводится за пределы функции. Невозможно получить доступ к свойствам запроса, как это можно сделать с объектом mysqli_stmt. Из-за этого ограничения информация о состоянии копируется в объект mysqli и доступна с помощью его методов, например, mysqli_affected_rows() или mysqli_error().

Замечание:

В случае, когда функции mysqli_execute_query() передаётся запрос, длина которого превышает max_allowed_packet сервера, возвращаемые коды ошибок различаются в зависимости от операционной системы. Поведение следующее:

  • В Linux возвращается код ошибки 1153. Сообщение об ошибке означает, что получен пакет размером более max_allowed_packet (got a packet bigger than max_allowed_packet bytes).

  • В Windows возвращается код ошибки 2006. Сообщение об ошибке означает, что сервер недоступен (server has gone away).

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

mysql

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

query

Запрос в виде строки. Он должен состоять из одного SQL-запроса.

SQL-запрос может содержать ноль или более маркеров параметров, представленных символами вопросительного знака (?) в соответствующих позициях.

Замечание:

Эти метки можно встраивать только в определённые места в выражении. Например, они разрешены в списке VALUES() выражения INSERT (чтобы задать значения столбцов для строки), или в операциях сравнения предложения WHERE для задания сравниваемого значения. Однако они не разрешены в качестве идентификаторов (таких как имена таблиц или столбцов).

params

Необязательный список в виде массива (array) с таким количеством элементов, сколько связанных параметров в выполняемом SQL-запросе. Каждое значение рассматривается как строка (string).

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

Возвращает false в случае возникновения ошибки. Для успешных запросов, создающих набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, возвращает объект mysqli_result. Для других успешных запросов возвращается true.

Примеры

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

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

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = $mysqli->execute_query($query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

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

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = mysqli_execute_query($link, $query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

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

Aachen (Nordrhein-Westfalen)
Augsburg (Baijeri)
Bergisch Gladbach (Nordrhein-Westfalen)
Berlin (Berliini)
Bielefeld (Nordrhein-Westfalen)

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

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result

add a note

User Contributed Notes 1 note

up
0
theking2(at)king(dot).co.
4 months ago
A function to call a stored procedure with an arbitrary number of IN parameters and one OUT parameter, for instance returning affected row count. The return value of yhe function is this value.

<?php

/**
* call_sp Call the specified stored procedure with the given parameters.
* The first parameter is the name of the stored procedure.
* The remaining parameters are the (in) parameters to the stored procedure.
* the last (out) parameter should be an int, like state or number of affected rows.
*
* @param mixed $sp_name The name of the stored procedure to call.
* @param mixed $params The parameters to pass to the stored procedure.
* @return int The number of affected rows.
*/
function call_sp( \mysqli $db, string $sp_name, ...$params ): int
{
$sql = "CALL $sp_name( ";
$sql .= implode( ", ", array_fill( 0, count( $params ), "?" ) );
$sql .= ", @__affected );";

$result = $db->execute_query( $sql, $params );
$result = $db->query( "select @__affected;" );
$affected = (int) $result->fetch_column( 0 );
return
$affected;
}
To Top