# PDO_MYSQL: драйвер модуля PDO для СУБД MySQL

## Введение

PDO_MYSQL — драйвер, через который PHP получает доступ к базам данных MySQL. Для этого драйвер реализует интерфейс модуля PDO.

Драйвер PDO_MYSQL по умолчанию использует эмулированную подготовку.

MySQL 8

При запуске PHP до версии 7.1.16 или PHP с версии 7.2 до версии 7.2.4 в качестве плагина шифрования паролей по умолчанию для сервера MySQL 8 устанавливают mysql_native_password, иначе выдаётся ошибка наподобие The server requested authentication method unknown to the client [caching_sha2_password], даже когда плагин caching_sha2_password не задали.

Причина этого состоит в том, что на сервере MySQL 8 в качестве плагина по умолчанию указан caching_sha2_password, который не распознаётся старыми выпусками PHP (драйвером mysqlnd). Вместо него в файле конфигурации сервера my.cnf указывают — `default_authentication_plugin=mysql_native_password`. Плагин caching_sha2_password получил полную поддержку начиная с PHP 7.4.4. В предыдущих версиях PHP его поддерживает модуль mysql_xdevapi.

Внимание

Осторожно: MySQL-таблицы подсистемы хранения данных не поддерживают транзакции. БД MySQL сделает вид, что транзакция успешно началась, если в коде, который работает с транзакционной базой данных, указали таблицу, которая не поддерживает транзакции. Кроме того, каждый выполненный DDL-запрос будет неявно фиксировать незавершённые транзакции — то есть завершать открытые транзакции и выполнять стек незавершённых запросов.

> Замечание:

> Драйвер MySQL неправильно обрабатывает бит `PDO::PARAM_INPUT_OUTPUT` в методе PDOStatement::bindParam(); хотя такие параметры и разрешается указывать, они не обновляются (т. е. фактический вывод игнорируется).

## Установка

Обычно установочные пакеты Unix имеют в своём составе бинарные пакеты PHP. Несмотря на то, что эти бинарные пакеты обычно собраны с поддержкой модуля MySQL, может понадобиться установка библиотек модулей отдельно. Проверьте свой дистрибутив на наличие нужных библиотек через пакетный менеджер.

К примеру, на Ubuntu установка пакета `php5-mysql` устанавливает модули ext/mysql, ext/mysqli, и PDO_MYSQL. На CentOS пакет `php-mysql` также устанавливает эти три модуля.

Также вы всегда можете скомпилировать необходимые модули самостоятельно. Сборка PHP из исходных кодов позволит вам собрать именно те модули MySQL, которые вам нужны, а также выбрать нужную клиентскую библиотеку для каждого модуля.

Используйте --with-pdo-mysql[=DIR] для установки модуля PDO MySQL, где необязательный параметр `[=DIR]` указывает директорию, где установлена MySQL. По умолчанию используется библиотека mysqlnd. Более детальный разбор по выбору библиотеки можно почитать в разделе "Выбор библиотеки MySQL".

Дополнительный параметр --with-mysql-sock[=DIR] указывает расположение unix-сокета MySQL для всех MySQL модулей, включая PDO_MYSQL. Если параметр не указан, поиск производится в директориях по умолчанию.

Дополнительный параметр --with-zlib-dir[=DIR] используется как префикс пути к libz.

    $ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

Поддержка SSL включается, используя соответствующую константу `Pdo\Mysql::ATTR_SSL_*`, которая эквивалентна вызову » API MySQL-функции mysql_ssl_set() в C. К тому же SSL не может быть включён с помощью PDO::setAttribute, потому что соединение уже существует. Смотрите документацию MySQL о » подключении к MySQL с SSL.

## Предопределённые константы

Драйвер определяет следующие константы и открывает доступ к ним только тогда, когда PHP собрали с поддержкой этого модуля, или модуль динамически загрузили при выполнении кода. Константы, которые зависят от драйвера, разрешается использовать только совместно с драйвером. Атрибуты одного драйвера с другим драйвером ведут себя неожиданно. Чтобы проверить название драйвера, которое содержит атрибут `PDO::ATTR_DRIVER_NAME`, вызывают метод PDO::getAttribute(), если код запускается с несколькими драйверами.

`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY` (int)
  Псевдоним `Pdo\Mysql::ATTR_USE_BUFFERED_QUERY`
`PDO::MYSQL_ATTR_LOCAL_INFILE` (int)
  Псевдоним `Pdo\Mysql::ATTR_LOCAL_INFILE`
`PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY` (int)
  Псевдоним `Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY`. Константа доступна с PHP 8.1.0.
`PDO::MYSQL_ATTR_INIT_COMMAND` (int)
  Псевдоним `Pdo\Mysql::ATTR_INIT_COMMAND`
`PDO::MYSQL_ATTR_READ_DEFAULT_FILE` (int)
  Псевдоним `Pdo\Mysql::ATTR_READ_DEFAULT_FILE`
`PDO::MYSQL_ATTR_READ_DEFAULT_GROUP` (int)
  Псевдоним `Pdo\Mysql::ATTR_READ_DEFAULT_GROUP`
`PDO::MYSQL_ATTR_MAX_BUFFER_SIZE` (int)
  Псевдоним `Pdo\Mysql::ATTR_MAX_BUFFER_SIZE`
`PDO::MYSQL_ATTR_DIRECT_QUERY` (bool)
  Псевдоним `PDO::ATTR_EMULATE_PREPARES` Начиная с PHP 8.4.0 у константы логический тип (bool); ранее использовался целочисленный тип (int).
`PDO::MYSQL_ATTR_FOUND_ROWS` (int)
  Псевдоним `Pdo\Mysql::ATTR_FOUND_ROWS`
`PDO::MYSQL_ATTR_IGNORE_SPACE` (int)
  Псевдоним `Pdo\Mysql::ATTR_IGNORE_SPACE`
`PDO::MYSQL_ATTR_COMPRESS` (int)
  Псевдоним `Pdo\Mysql::ATTR_COMPRESS`
`PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY` (int)
  Псевдоним `Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY`
`PDO::MYSQL_ATTR_SSL_CA` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_CA`
`PDO::MYSQL_ATTR_SSL_CAPATH` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_CAPATH`
`PDO::MYSQL_ATTR_SSL_CERT` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_CERT`
`PDO::MYSQL_ATTR_SSL_CIPHER` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_CIPHER`
`PDO::MYSQL_ATTR_SSL_KEY` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_KEY`
`PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT` (int)
  Псевдоним `Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT` Константа доступна с PHP 7.0.18 и PHP 7.1.4.
`PDO::MYSQL_ATTR_MULTI_STATEMENTS` (int)
  Псевдоним `Pdo\Mysql::ATTR_MULTI_STATEMENTS`

## Настройка во время выполнения

Поведение функций зависит от установок в файле php.ini.

Опции конфигурации PDO_MYSQL
Имя | По умолчанию | Место изменения
--- | --- | ---
pdo_mysql.default_socket | "/tmp/mysql.sock" | `INI_SYSTEM`
pdo_mysql.debug | NULL | `INI_SYSTEM`

Дополнительную информацию и определения режимов INI_* даёт раздел «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

`pdo_mysql.default_socket` string

  Устанавливает сокет домена UNIX. Эту опцию необходимо указать во время компиляции, если сокет домена найден во время конфигурирования. Эта настройка только для Unix.

`pdo_mysql.debug` bool

  Разрешает отладку для PDO_MYSQL. Эта настройка доступна только, если PDO_MYSQL скомпилирован с "mysqlnd" и в режиме отладки PDO.

## Содержание

- DSN-строка подключения через драйвер PDO_MYSQL — Соединение с базой данных MySQL

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open