To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
It will not work when passed into PDO::prepare()
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
(int)
PDO::ATTR_EMULATE_PREPARES
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.default_socket | "/tmp/mysql.sock" | INI_SYSTEM |
pdo_mysql.debug | NULL | INI_SYSTEM |
Краткое разъяснение конфигурационных директив.
pdo_mysql.default_socket
string
Устанавливает сокет домена UNIX. Эту опцию необходимо указать во время компиляции, если сокет домена найден во время конфигурирования. Эта настройка только для Unix.
pdo_mysql.debug
bool
Разрешает отладку для PDO_MYSQL. Эта настройка доступна только, если PDO_MYSQL скомпилирован с "mysqlnd" и в режиме отладки PDO.
To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
It will not work when passed into PDO::prepare()
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...
After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server's box.
Upgraded the MySQL client on the web server to the current revision and the problem went away.
> change it by setting default_authentication_plugin=mysql_native_password in my.cnf
This only works in MySQL 8.0. The default_authentication_plugin variable has been removed from 8.4.