要使用“PDO::MYSQL_ATTR_USE_BUFFERED_QUERY”,应调用
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
传递给 PDO::prepare() 时,它将不起作用。
PDO_MYSQL 是一个实现了PHP 数据对象 (PDO) 接口的驱动程序,允许 PHP 访问 MySQL 数据库。
PDO_MYSQL 默认使用模拟预处理。
MySQL 8
在运行低于 7.1.16 的 PHP 版本,或低于 7.2.4 的 PHP 7.2 版本时,请将 MySQL 8 服务器的默认密码插件设置为mysql_native_password,否则即使没有使用caching_sha2_password,也会看到类似于The server requested authentication method unknown to the client [caching_sha2_password] 的错误。
这是因为 MySQL 8 默认使用 caching_sha2_password,这是一个旧版 PHP (mysqlnd) 版本无法识别的插件。 可以通过在my.cnf中设置default_authentication_plugin=mysql_native_password
来更改它。 从 PHP 7.4.4 开始完全支持caching_sha2_password 插件。对于较旧的版本,mysql_xdevapi扩展程序支持它。
注意:某些 MySQL 表类型(存储引擎)不支持事务。 当使用不支持事务的表类型编写事务性数据库代码时,MySQL 将假装事务已成功启动。此外,任何发出的 DDL 查询都将隐式提交任何挂起的交易。
注意:
MySQL 驱动程序不正确地支持
PDO::PARAM_INPUT_OUTPUT
通过 PDOStatement::bindParam();虽然可以使用此类参数,但不会更新它们(即忽略实际输出)。
常见的 Unix 发行版包含可以安装的 PHP 二进制版本。虽然这些二进制版本通常都内置了对 MySQL 扩展的支持,但可能需要使用额外的软件包安装扩展库本身。检查所选发行版附带的包管理器以查看其可用性。
例如,在 Ubuntu 上,php5-mysql
软件包安装 ext/mysql、ext/mysqli 和 PDO_MYSQL PHP 扩展。在 CentOS 上,php-mysql
软件包也安装这三个 PHP 扩展。
或者,您可以自己编译此扩展。从源代码构建 PHP 允许您指定要使用的 MySQL 扩展,以及每个扩展的客户端库选择。
编译时,使用--with-pdo-mysql[=DIR]安装 PDO MySQL 扩展,其中可选的[=DIR]
是 MySQL 基础库。Mysqlnd 是默认库。有关选择库的详细信息,请参阅选择 MySQL 库。
可选地,--with-mysql-sock[=DIR]设置所有 MySQL 扩展(包括 PDO_MYSQL)的 MySQL unix socket 指针的位置。如果未指定,则搜索默认位置。
可选地,--with-zlib-dir[=DIR]用于设置 libz 安装前缀的路径。
$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock
使用适当的Pdo\Mysql::ATTR_SSL_*
启用SSL支持,这等效于调用» MySQL C API 函数 mysql_ssl_set()。此外,无法使用PDO::setAttribute()启用 SSL,因为连接已存在。另请参阅有关» 使用 SSL 连接到 MySQL的 MySQL 文档。
以下常量由此驱动程序定义,并且只有在将扩展编译到 PHP 中或在运行时动态加载时才可用。此外,只有在使用此驱动程序时才应使用这些特定于驱动程序的常量。将特定于驱动程序的属性与另一个驱动程序一起使用可能会导致意外行为。PDO::getAttribute() 可用于获取PDO::ATTR_DRIVER_NAME
属性以检查驱动程序,如果您的代码可以针对多个驱动程序运行。
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
的别名
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_ATTR_USE_BUFFERED_QUERY”,应调用
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
传递给 PDO::prepare() 时,它将不起作用。
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...
在花费数小时尝试追踪为什么我们在新服务器上收到此错误(相同的代码在其他服务器上运行良好)后,我们发现问题是 web 服务器上运行的旧版 MySQL _客户端_ 库,以及数据库服务器上运行的最新版 MySQL _服务器_。
将 web 服务器上的 MySQL 客户端升级到最新版本,问题就解决了。
> 通过在 my.cnf 中设置 default_authentication_plugin=mysql_native_password 来更改它
这仅在 MySQL 8.0 中有效。default_authentication_plugin 变量已从 8.4 中删除。