mysqli_stmt::get_result 方法的替代方案

作者:西瓜玩偶(racnil070512 at hotmail dot com) 我们都知道,在mysqli库中,通过 mysqli_stmt::execute 调用之后,我们可以进而使用 mysqli_stmt::get_result 来获取更多的信息。例如: $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_array(MYSQLI_ASSOC)) { echo $row['name'] . ': ' . $row['email'] . PHP_EOL; } 然而,方法 mysqli_stmt::get_result 的调用是依赖于 mysqlnd (MySQL原生驱动)的。在某些服务器环境中,并没有安装 mysqlnd 驱动,所以自然也无法调用 mysqli_stmt::get_result 来获取查询的结果了。此时我们可以使用下面的替代方案: function getResult($stmt) { $result = array(); $stmt->store_result(); for ($i = 0; $i < $stmt->num_rows; $i++) { $metadata = $stmt->result_metadata(); $params = array(); while($field = $metadata->fetch_field()) { $params[] = &$result[$i][$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $params); $stmt->fetch(); } $stmt->free_result();

return $result;

}

这个函数中,参数为我们调用过 mysqli_stmt::execute 方法的 mysqli_stmt 对象。函数的实现步骤如下: 首先我们创建一个新的数组变量 $result 用于存储结果。 接下来我们调用 $stmt->store_result(); 将查询的结果保存至内存中(注:若查询结果非常多,则不应当使用这条语句,因为这样会大幅度增加服务器的内存使用量)。 然后我们对查询结果的每一行进行如下的操作: 我们首先获取每一行查询结果的元信息,并且从中获得结果每一列的列名(利用 $metadata->fetch_field() 获取一列的列名),例如 name 和 email 。 然后我们在 $result 中创建相应的行与列,并且将引用放在 $params ,以供后面的函数调用使用。 利用 call_user_func_array 函数,我们调用了 $stmt->bind_result() ,参数就是刚刚我们生成的 $params 数组,目的是将结果与 $result 中的元素绑定。 最后执行 $stmt->fetch() ,这个方法会获取一行查询结果,并且给上一步绑定了的参数赋值。由于在上一步中,我们绑定的参数就是 $result 中相应的元素,故结果就存入了 $result 。 接下来,我们利用 $stmt->free_result(); 的调用,清空保存在本地的MySQL查询结果(这条语句是与前面的 $stmt->store_result(); 对应的)。 最后,将 $result 返回。 要使用上面的函数,可以参考下面的例子代码: $stmt->execute(); $queryResults = getResult($stmt); foreach ($queryResults as $row) { echo $row['name'] . ': ' . $row['email'] . PHP_EOL; } 参考资料: http://stackoverflow.com/questions/10752815/mysqli-get-result-alternative http://php.net/manual/en/mysqli-stmt.get-result.php http://php.net/manual/en/class.mysqli-stmt.php

这篇文章由热心用户 西瓜玩偶 投稿,小编代表广大读者感谢西瓜玩偶,同时希望更多的读者朋友积极参与投稿,分享自己的经验。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

ansible之playbook功能简述

playbooks剧本简介 playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Ye...

2825
来自专栏Python

python flask里 post请求,JSON数据获取方式总结

#!flask/bin/python #encodig=utf-8 # _*_ coding:utf-8 _*_ # Writer : byz # dateTi...

4395
来自专栏技巅

Glusterfs之nfs模块源码分析(中)之Glusterfs实现NFS服务器

1787
来自专栏Pythonista

python文件操作

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

902
来自专栏前端杂货铺

高吞吐koa日志中间件

Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer...

43610
来自专栏Google Dart

AngularDart Material Design 选项卡 顶

注意:为了获得高质量的用户体验,选项卡条的用户必须将焦点设置为新显示的内容,以便1)选项卡不保留焦点样式,2)屏幕阅读器可以计算已更改的内容。

552
来自专栏carven

koa+socket.io尝试简单的web动作同步

尝试用过browser-sync辅助开发的前端同学,大概都会感到神奇:在多个端打开网页,网页的动作却是完全同步的。

530
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(五):简易留言簿交互实现

努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

1978
来自专栏BestSDK

Android Studio 开发必备的17个快捷键,效率提高一倍!

1. 书签(Bookmarks) 描述:这是一个很有用的功能,让你可以在某处做个标记(书签),方便后面再跳转到此处。 调用:Menu → Navigate → ...

37912
来自专栏西枫里博客

去除html标签并截取字符串函数

主要为了处理编...

684

扫码关注云+社区