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 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Vue.js 2.5新特性介绍

TypeScript TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和...

2258
来自专栏bdcn

Flask学习笔记-使用bootstrap-datepicker实现页面日期选择 顶

这个插件的样式个人觉得还是很不错,而且可以功能也是比较全的,多语言的支持也很全面,中文化很方便。

642
来自专栏安恒网络空间安全讲武堂

MS08-067漏洞调试分析详解

MS08-067漏洞调试分析详解 一、前言 在《Metasploit渗透测试魔鬼训练营》中有对MS08-067漏洞原理的分析,不过作者的文笔十分晦涩难懂,读起来...

22010
来自专栏nice_每一天

教你开发jQuery插件(转) 教你开发jQuery插件(转)

原文:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html

701
来自专栏逆向技术

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计...

1867
来自专栏互联网开发者交流社区

SEO-搜索引擎高级搜索指令

1225
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

React Native 开发适配心得

众所周知用React Native是可以开发跨平台的Android和iOS App。我们可以用React Native开发Android应用也可以开发iOS应用...

3105
来自专栏大前端开发

从编程小白到全栈开发:响应用户的操作

咳嗽连续咳了一个多月,蓝瘦,我都快要忘记更新文章了...还好一个读友提醒我怎么好久没更新了,我才提起一口气,嘎吱嘎吱的重新转起我这磨损严重的脑袋来。

674
来自专栏超然的博客

高效开发之SASS篇

作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~

451
来自专栏木子昭的博客

详解Django自定义过滤器

过滤器与函数 django过滤器的本质是函数,但"函数"太多了,为了显示自己的与众不同,设计者们想了个名字"过滤器"... django有一些内置的过滤器,但和...

3277

扫描关注云+社区