(PHP 5, PHP 7, PHP 8)
mysqli_stmt::prepare -- mysqli_stmt_prepare — Подготавливает утверждение SQL к выполнению
Объектно-ориентированный стиль
Процедурный стиль
Подготавливает утверждение к выполнению. Запрос должен состоять из одного оператора SQL.
Шаблон утверждения может содержать ноль или несколько вопросительных знаков
(?
), меток параметров, также называемых заполнителями.
Метки параметров должны быть привязаны к переменным приложения с помощью
mysqli_stmt_bind_param() перед выполнением утверждения.
строк.
Замечание:
В случае, если длина выражения, которое передаётся в mysqli_stmt_prepare(), больше, чем
max_allowed_packet
сервера, возвращаемые коды ошибки могут различаться в зависимости от используемого драйвера. А это может быть либо родной MySQL-драйвер (mysqlnd
), либо клиентская библиотека MySQL (libmysqlclient
). Поведение функции будет следующим:
mysqlnd
на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означаетразмер пакета превышает.max_allowed_packet
байт
mysqlnd
на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означаетсервер недоступен.
libmysqlclient
на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означаетсервер недоступен.
stmt
Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().
query
Текст запроса в виде строки. Запрос должен состоять из одного SQL-выражения.
Утверждение SQL может содержать ноль или более меток параметров,
представленных знаками вопроса (?
)
в соответствующих позициях.
Замечание:
Метки параметров запроса можно встраивать только в определённые места в выражении. Например, они допустимы в списке
VALUES()
выраженияINSERT
(чтобы задать значения столбцов для строки), или в операциях сравнения предложенияWHERE
для задания сравниваемого значения. Однако, эти метки недопустимы в качестве идентификаторов (таких как имена столбцов или таблиц).
Функция возвращает true
, если выполнилась успешно, или false
, если возникла ошибка.
Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR
) и запрошенная операция не удалась,
выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT
,
вместо этого будет выброшено исключение mysqli_sql_exception.
Пример #1 Пример использования mysqli_stmt::prepare()
Объектно-ориентированный стиль
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$city = "Amersfoort";
/* Создаём подготовленное утверждение */
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT District FROM City WHERE Name=?");
/* Связываем переменные с метками */
$stmt->bind_param("s", $city);
/* Выполняем запрос */
$stmt->execute();
/* Связываем переменные результата */
$stmt->bind_result($district);
/* Получаем значение */
$stmt->fetch();
printf("%s находится в районе %s\n", $city, $district);
Процедурный стиль
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$city = "Amersfoort";
/* Создаём подготовленное утверждение */
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "SELECT District FROM City WHERE Name=?");
/* Связываем переменные с метками */
mysqli_stmt_bind_param($stmt, "s", $city);
/* Выполняем запрос */
mysqli_stmt_execute($stmt);
/* Связываем переменные результата */
mysqli_stmt_bind_result($stmt, $district);
/* Получаем значение */
mysqli_stmt_fetch($stmt);
printf("%s находится в районе %s\n", $city, $district);
Результат выполнения приведённых примеров:
Amersfoort находится в районе Utrecht