You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8.2下PDO报MYSQL_ATTR_INIT_COMMAND未定义类常量错误求助

解决PHP 8.2中PDO::MYSQL_ATTR_INIT_COMMAND未定义的问题

错误原因

PHP 8.2起,PDO::MYSQL_ATTR_INIT_COMMAND不再是PDO类的全局常量,仅在启用pdo_mysql扩展时才会被定义。若环境未加载该扩展,就会触发此错误。此外该常量已被官方标记为废弃,推荐使用更通用的替代方案。

解决办法

方法1:确保pdo_mysql扩展已启用

  • 执行命令 php -m | grep pdo_mysql 检查是否存在该扩展,也可通过phpinfo()页面查找pdo_mysql相关条目。
  • 若未启用,在php.ini中添加或开启配置:
    ; Linux/macOS环境
    extension=pdo_mysql
    
    ; Windows环境
    extension=php_pdo_mysql.dll
    
  • 重启Web服务器或PHP-FPM服务后生效。

方法2:使用字符串字面量替代常量

直接用字符串'MYSQL_ATTR_INIT_COMMAND'代替类常量,PDO MySQL驱动可识别该键名:

if (!isset($this->driver_options['MYSQL_ATTR_INIT_COMMAND'])) {
    // STRICT_ALL_TABLES 5.0.2
    // NO_ZERO_DATE 5.0.2
    // NO_ZERO_IN_DATE 5.0.2
    // ERROR_FOR_DIVISION_BY_ZERO 5.0.2
    // NO_ENGINE_SUBSTITUTION 5.0.8
    $this->driver_options['MYSQL_ATTR_INIT_COMMAND'] = 'set session sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"';
}

方法3:使用通用的PDO初始化命令常量(推荐)

改用PDO全局常量PDO::ATTR_INIT_COMMAND,它适用于所有PDO驱动,且不会因扩展未加载报错:

if (!isset($this->driver_options[\PDO::ATTR_INIT_COMMAND])) {
    // STRICT_ALL_TABLES 5.0.2
    // NO_ZERO_DATE 5.0.2
    // NO_ZERO_IN_DATE 5.0.2
    // ERROR_FOR_DIVISION_BY_ZERO 5.0.2
    // NO_ENGINE_SUBSTITUTION 5.0.8
    $this->driver_options[\PDO::ATTR_INIT_COMMAND] = 'set session sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"';
}

内容的提问来源于stack exchange,提问作者yostijognu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:35:29