2024 年 PHP 日本大会

MySQL 函数 (PDO_MYSQL)

简介

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 配置选项
名称 默认值 可更改
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
有关 INI_* 模式的更多详细信息和定义,请参见 配置设置的设置位置

以下是配置指令的简短说明。

pdo_mysql.default_socket string

设置 Unix 域套接字。如果在配置时找到域套接字,则可以设置此值。此 ini 设置仅限于 Unix 系统。

pdo_mysql.debug bool

启用 PDO_MYSQL 的调试功能。仅当 PDO_MYSQL 使用 mysqlnd 编译并在 PDO 调试模式下时,此设置才可用。

目录

添加注释

用户贡献的注释 3 条注释

7
davey at php dot net
17 年前
要使用“PDO::MYSQL_ATTR_USE_BUFFERED_QUERY”,应调用
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

传递给 PDO::prepare() 时,它将不起作用。
6
brian at diamondsea dot com
16 年前
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

在花费数小时尝试追踪为什么我们在新服务器上收到此错误(相同的代码在其他服务器上运行良好)后,我们发现问题是 web 服务器上运行的旧版 MySQL _客户端_ 库,以及数据库服务器上运行的最新版 MySQL _服务器_。

将 web 服务器上的 MySQL 客户端升级到最新版本,问题就解决了。
0
snoyes at gmail dot com
1 个月前
> 通过在 my.cnf 中设置 default_authentication_plugin=mysql_native_password 来更改它

这仅在 MySQL 8.0 中有效。default_authentication_plugin 变量已从 8.4 中删除。
To Top