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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:36:05