MySQLnd缺失导致get_result()未定义?如何协同主机服务商排查?
故障诊断与解决方案
自行排查操作
- 查看phpinfo输出中
mysqli模块的Client API library version字段:若字段值为libmysqlclient+版本号,即为使用旧驱动,该截图可作为直接举证材料;若为mysqlnd开头才是正常启用mysqlnd。 - 检查站点根目录、应用目录下的
.user.ini或自定义php.ini配置:排查是否存在手动指定extension=mysqli.so的配置,或扩展加载优先级相关配置,导致非mysqlnd版本的mysqli扩展被优先加载。 - 若主机支持多PHP版本切换,可切换到其他PHP版本运行驱动验证代码,确认是否仅当前8.0.10版本存在编译配置问题。
向主机商举证的核心依据
你提供的PHP编译参数存在明确配置错误:
编译参数中
--with-mysqli=/usr/bin/mysql_config、--with-pdo-mysql=/usr/bin/mysql_config,仅废弃的--with-mysql参数使用了mysqlnd。
正确的mysqli绑定mysqlnd的编译参数应为--with-mysqli=mysqlnd,而非指向mysql_config。这说明当前环境下mysqlnd确实已编译,但仅老旧废弃的mysql扩展使用了该驱动,你实际使用的mysqli扩展是基于libmysqlclient编译的,自然不支持get_result()方法,与你的验证结果完全吻合。
另外PHP构建日期为7天前,恰好位于故障发生前,可要求主机商核对最近的PHP编译更新记录。
故障突发的可能原因
- 主机商近期重新编译了PHP 8.0版本,编译时错误配置了mysqli的驱动绑定参数,此前的PHP版本mysqli正常绑定mysqlnd,因此代码可正常运行。
- 主机商调整了站点的PHP运行模式,此前使用的是用户自定义的PHP版本/扩展配置,近期切换到了存在配置错误的全局PHP版本。
- 主机端调整了PHP扩展的加载顺序,此前mysqlnd优先于mysqli加载,mysqli可自动绑定mysqlnd,调整后mysqli优先加载,自动绑定了系统默认的libmysqlclient。
临时兼容方案
若主机商修复周期较长,可暂时将get_result()调用替换为不需要mysqlnd支持的bind_result方案:
$sql = 'SELECT * FROM projects WHERE projects.id = ? LIMIT 1'; $stmt = mysqli_prepare($db, $sql); $stmt->bind_param("i", $project_id); $stmt->execute(); // 替换get_result()的代码开始 $stmt->store_result(); $meta = $stmt->result_metadata(); $fields = []; $row = []; while ($field = $meta->fetch_field()) { $fields[] = &$row[$field->name]; } call_user_func_array([$stmt, 'bind_result'], $fields); $result = []; while ($stmt->fetch()) { // 拷贝数据避免引用覆盖 $result[] = array_map(fn($value) => $value, $row); } // 替换代码结束 // 后续可正常处理$result数组
内容的提问来源于stack exchange,提问作者Spacey
相关产品推荐
相关产品推荐

