调用未定义函数mysqli_stmt_get_result()问题求助:本地正常线上异常
解决
mysqli_stmt_get_result()未定义的问题 这个问题我碰到过好多次,核心原因其实很明确:mysqli_stmt_get_result()函数依赖MySQL Native Driver(mysqlnd)扩展,你的虚拟主机PHP 5.5.38环境大概率没启用这个扩展,而本地XAMPP默认是自带并开启的,所以本地能跑,线上不行。
为什么会这样?
PHP从5.3开始就内置了mysqlnd,但很多老虚拟主机为了兼容旧配置,还是沿用传统的libmysqlclient驱动,而mysqli_stmt_get_result()是mysqlnd独有的函数,用libmysqlclient的话就会报“未定义”错误。
具体解决办法
1. 先确认虚拟主机是否启用了mysqlnd
创建一个phpinfo.php文件,内容如下:
<?php phpinfo(); ?>
上传到虚拟主机访问后,搜索“mysqlnd”关键词:
- 如果能找到相关条目,那可能是mysqli的配置有问题,可以联系主机商排查;
- 如果找不到,说明没装mysqlnd,分两种情况处理:
- 如果你用的是VPS类主机且有权限修改php.ini,可以添加
extension=mysqlnd.so(Linux)或extension=php_mysqlnd.dll(Windows),然后重启PHP服务; - 如果你是共享虚拟主机,只能联系主机商帮你开启mysqlnd扩展。
- 如果你用的是VPS类主机且有权限修改php.ini,可以添加
2. 无法开启mysqlnd?换一种写法替代
如果主机商不给开mysqlnd,那就只能修改代码,不用mysqli_stmt_get_result(),改用手动绑定结果的方式。举个实际例子:
原来的代码(依赖mysqlnd):
$stmt = mysqli_prepare($conn, "SELECT id, name FROM users WHERE email = ?"); mysqli_stmt_bind_param($stmt, "s", $user_email); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); while ($row = mysqli_fetch_assoc($result)) { echo "ID: {$row['id']}, Name: {$row['name']}"; }
修改后的代码(不依赖mysqlnd):
$stmt = mysqli_prepare($conn, "SELECT id, name FROM users WHERE email = ?"); mysqli_stmt_bind_param($stmt, "s", $user_email); mysqli_stmt_execute($stmt); // 绑定结果到变量,顺序要和查询的列严格对应 mysqli_stmt_bind_result($stmt, $id, $name); // 循环获取数据 while (mysqli_stmt_fetch($stmt)) { // 把变量组装成数组,方便后续处理 $row = ['id' => $id, 'name' => $name]; echo "ID: {$row['id']}, Name: {$row['name']}"; }
如果你的查询列数不固定,也可以用元数据动态绑定,写法稍微复杂但通用性更强:
$stmt = mysqli_prepare($conn, $your_sql_query); mysqli_stmt_bind_param($stmt, "s", $param); // 根据你的参数类型调整占位符 mysqli_stmt_execute($stmt); // 获取结果元数据 $meta = mysqli_stmt_result_metadata($stmt); $fields = mysqli_fetch_fields($meta); // 动态绑定结果变量 $data = []; $variables = []; foreach ($fields as $field) { $variables[] = &$data[$field->name]; } call_user_func_array('mysqli_stmt_bind_result', array_merge([$stmt], $variables)); // 循环取数 while (mysqli_stmt_fetch($stmt)) { $row = []; foreach ($data as $key => $val) { $row[$key] = $val; } // 处理$row数据 }
3. 长远建议:升级PHP版本
你的虚拟主机用的PHP 5.5.38已经停止安全更新很多年了,不仅有安全隐患,还会碰到大量兼容性问题。如果可能的话,建议联系主机商升级到PHP 7.4及以上版本——新版本默认启用mysqlnd,还能大幅提升代码性能。
内容的提问来源于stack exchange,提问作者James Blanton
相关产品推荐
相关产品推荐

