mysqli_options()
Узнайте, как PHP mysqli_options() задаёт параметры подключения — тайм-ауты и LOCAL INFILE — до открытия соединения MySQLi.
Функция mysqli_options() задаёт дополнительные параметры подключения, определяющие, как PHP взаимодействует с MySQL. В этом руководстве объясняется, что делает каждый распространённый параметр, строгое правило о том, когда его можно вызывать, и как объединить его с mysqli_real_connect() в реальной последовательности подключения.
Введение в функцию mysqli_options()
mysqli_options() настраивает поведение дескриптора подключения MySQLi до открытия соединения. Это процедурный эквивалент объектно-ориентированного метода mysqli::options().
Ключевое, что нужно понять, — это порядок операций. Обычный вызов mysqli_connect() одновременно создаёт дескриптор и подключается за один шаг, не оставляя возможности задать параметры. Чтобы использовать mysqli_options(), необходимо разделить эти два шага:
- Создать неподключённый дескриптор с помощью
mysqli_init(). - Задать один или несколько параметров с помощью
mysqli_options(). - Открыть фактическое подключение с помощью
mysqli_real_connect().
Установка параметра после того, как соединение уже открыто, либо не имеет эффекта, либо завершается ошибкой — в зависимости от параметра.
Синтаксис
mysqli_options(mysqli $mysql, int $option, mixed $value): bool$mysql— дескриптор подключения, возвращённыйmysqli_init()(ещё не подключённый).$option— одна из констант параметровMYSQLI_*(см. ниже).$value— значение для данного параметра; ожидаемый тип зависит от параметра.
Функция возвращает true при успехе и false при ошибке.
Часто используемые константы параметров
| Константа | Тип значения | Назначение |
|---|---|---|
MYSQLI_OPT_CONNECT_TIMEOUT | целое число (секунды) | Максимальное время ожидания при открытии подключения. |
MYSQLI_OPT_READ_TIMEOUT | целое число (секунды) | Максимальное время ожидания результата запроса. |
MYSQLI_OPT_LOCAL_INFILE | 0 или 1 | Включить или отключить LOAD DATA LOCAL INFILE. |
MYSQLI_INIT_COMMAND | string | SQL-оператор, выполняемый автоматически после подключения/переподключения. |
MYSQLI_OPT_INT_AND_FLOAT_NATIVE | 0 или 1 | Возвращать целочисленные и вещественные столбцы как нативные типы PHP (только mysqlnd). |
Как использовать функцию mysqli_options()
Пример ниже инициализирует дескриптор, задаёт тайм-аут подключения и включает загрузку локальных файлов, а затем открывает соединение:
<?php
$mysqli = mysqli_init();
/* Set connection timeout to 10 seconds */
mysqli_options($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 10);
/* Enable LOAD DATA LOCAL INFILE */
mysqli_options($mysqli, MYSQLI_OPT_LOCAL_INFILE, 1);
/* Now open the actual connection */
if (!mysqli_real_connect($mysqli, "localhost", "username", "password", "database")) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>Здесь мы сначала создаём неподключённый дескриптор с помощью mysqli_init(), настраиваем тайм-аут и поведение с локальными файлами через mysqli_options(), и только после этого подключаемся с помощью mysqli_real_connect(). Результат подключения проверяется с помощью mysqli_connect_error(), которая возвращает описание последней ошибки подключения.
Выполнение команды сразу после подключения
MYSQLI_INIT_COMMAND удобен, когда каждое соединение должно начинаться в известном состоянии — например, для принудительной установки набора символов сессии или часового пояса. Оператор выполняется после каждого подключения и переподключения:
<?php
$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_INIT_COMMAND, "SET NAMES 'utf8mb4'");
if (!mysqli_real_connect($mysqli, "localhost", "username", "password", "database")) {
die("Connection failed: " . mysqli_connect_error());
}
?>Распространённые ошибки
- Вызывайте до подключения. Это наиболее частая ошибка. Используйте
mysqli_init()+mysqli_options()+mysqli_real_connect(), но никогда не используйте обычныйmysqli_connect(). - SSL — отдельно. Пути к сертификату, ключу и CA настраиваются с помощью
mysqli_ssl_set(), а неmysqli_options(). MYSQLI_OPT_LOCAL_INFILE— это настройка безопасности. Включайте её только если вам действительно нуженLOAD DATA LOCAL INFILE; включение может позволить скомпрометированному серверу читать локальные файлы.- Проверяйте возвращаемое значение.
mysqli_options()возвращаетfalseдля неподдерживаемых параметров, поэтому стоит проверять это, когда параметр молча не работает.
Заключение
mysqli_options() позволяет точно настроить подключение MySQLi — тайм-ауты, загрузку локальных файлов и команды при запуске — но только в рамках последовательности mysqli_init() → mysqli_options() → mysqli_real_connect(). Для продолжения работы с подключениями MySQLi смотрите mysqli_connect() и как диагностировать ошибки с помощью mysqli_connect_error().