(PHP 5, PHP 7)
mysqli_stmt::prepare -- mysqli_stmt_prepare — Подготовка SQL-запроса к выполнению
Объектно-ориентированный стиль
Процедурный стиль
Подготавливает SQL-запрос, переданный в виде строки с завершающим нулем.
Метки параметров должны быть связаны с переменными приложения функциями mysqli_stmt_bind_param() и/или mysqli_stmt_bind_result() до запуска запроса или выборки строк.
Замечание:
В случае, если длина выражения, которое вы передаете в mysqli_stmt_prepare(), больше, чем max_allowed_packet сервера, возвращаемые коды ошибки могут различаться в зависимости от используемого драйвера. А это может быть либо родной MySQL-драйвер (mysqlnd), либо клиентская библиотека MySQL (libmysqlclient). Поведение функции будет следующим:
mysqlnd на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означает
размер пакета превышает max_allowed_packet байт.mysqlnd на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означает
сервер недоступен.libmysqlclient на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означает
сервер недоступен.
stmt
Только для процедурного стиля: Идентификатор выражения, полученный с помощью mysqli_stmt_init().
query
Текст запроса в виде строки. Запрос должен состоять из одного SQL-выражения.
Запрос может содержать одну или несколько меток параметров SQL-запроса. Эти метки можно добавить путем встраивания знаков вопроса (?) в места выражения, где требуется подставлять параметры.
Замечание:
Нет необходимости в завершающей точке с запятой или символе \g в конце выражения.
Замечание:
Метки параметров запроса можно встраивать только в определенные места в выражении. Например, они допустимы в списке VALUES() выражения INSERT (чтобы задать значения столбцов для строки), или в операциях сравнения предложения WHERE для задания сравниваемого значения.
Однако, эти метки недопустимы в качестве идентификаторов (таких как имена столбцов или таблиц), а также в списке псевдонимов столбцов предложения SELECT. Нельзя также использовать параметры для задания обоих операндов бинарного оператора (например, знак равенства =). Последнее ограничение необходимо, так как в противном случае невозможно будет определить тип операндов. В основном, параметры допустимы в выражениях языка манипулирования данными (DML), и недопустимы в выражениях языка определения данных (DDL).
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Пример #1 Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* создаем подготавливаемый запрос */
$stmt = $mysqli->stmt_init();
if ($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);
/* закрываем запрос */
$stmt->close();
}
/* закрываем соединение */
$mysqli->close();
?>
Пример #2 Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* создаем подготавливаемый запрос */
$stmt = mysqli_stmt_init($link);
if (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);
/* закрываем запрос */
mysqli_stmt_close($stmt);
}
/* закрываем соединение */
mysqli_close($link);
?>
Результат выполнения данных примеров:
Amersfoort находится в округе Utrecht