全局设置MySQL获取模式:解决ADODB返回stdClass对象的toArray报错问题
问题根因说明
你遇到的报错是PHP Fatal error: Call to undefined method stdClass::toArray(),根因是ADODB配置$ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT时,返回格式完全依赖底层PHP数据库驱动的默认配置,新服务器的PHP数据库驱动默认返回stdClass对象,旧服务器默认返回数组,导致原有调用数组方法的业务代码报错。
不修改业务代码的解决方法
1. 查询当前驱动默认返回格式
新建临时测试PHP文件,替换对应数据库连接参数后运行即可查看:
<?php // 替换为实际数据库连接信息 $dbHost = '你的数据库地址'; $dbUser = '你的数据库账号'; $dbPass = '你的数据库密码'; $dbName = '你的数据库名'; // 测试原生驱动默认返回格式(以MySQLi为例,其他驱动同理) $conn = mysqli_connect($dbHost, $dbUser, $dbPass, $dbName); $result = mysqli_query($conn, "SELECT 'test' as demo LIMIT 1"); $defaultResult = mysqli_fetch_array($result); var_dump($defaultResult); // 查看ADODB当前实际生效的返回模式 require_once '你的ADODB入口文件路径/adodb.inc.php'; $adodbConn = ADONewConnection('mysqli'); // 替换为你实际使用的驱动类型 $adodbConn->Connect($dbHost, $dbUser, $dbPass, $dbName); echo "ADODB当前返回模式值:" . $ADODB_FETCH_MODE;
运行后如果返回的是对象类型,说明当前驱动默认返回对象,和你判断的一致。
2. 配置调整方案
以下两种方案都不需要修改现有业务代码:
- 方案一:全局固定ADODB返回模式
在应用的全局公共配置文件加载最开头,或者ADODB的初始化文件开头,增加一行配置,直接固定返回数组格式:$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
你可以根据旧环境的实际返回格式选择对应参数:ADODB_FETCH_ASSOC为关联数组,ADODB_FETCH_NUM为索引数组,ADODB_FETCH_BOTH为同时返回关联和索引数组。 - 方案二:通过PHP运行配置前置加载配置
如果不想修改应用或ADODB的源码,可以通过PHP的自动前置加载配置实现全局覆盖:
- 新建独立的配置文件
adodb_fix.php,内容如下:
<?php // 固定ADODB返回模式为关联数组 define('ADODB_FETCH_ASSOC', 2); $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
- 修改站点对应的
php.ini配置,增加如下配置项:auto_prepend_file = /你的文件绝对路径/adodb_fix.php - 重启PHP服务后配置即可生效。
内容的提问来源于stack exchange,提问作者Christian Riese
相关产品推荐
相关产品推荐

