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
相关产品推荐
相关产品推荐

