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

相关文章

来自专栏小樱的经验随笔

【经验分享】后台常用的万能密码

这万能密码好几年前就有了。我都不当回事,结果这次真派上用场了,还真进了后台了 网站后台万能密码就是在用户名与密码处都写入下列字符,如果知道管理员帐号的话直接添...

1.1K5
来自专栏编舟记

如何在@SpringBootTest中动态地启用不同的profiles

这个类存在的意义就是为了让其它类别的 ResourceTest 继承它,并在一次启动当中运行完所有的集成测试。避免每个 ResourceTest 都初始化启动 ...

2613
来自专栏腾讯Bugly的专栏

Android 平台 Native 代码的崩溃捕获机制及实现

一、背景 在Android平台,native crash一直是crash里的大头。native crash具有上下文不全、出错信息模糊、难以捕捉等特点,比jav...

1.1K7
来自专栏小勇DW3

Java设计模式-单例模式

作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:

1205
来自专栏小俊博客

ThinkPHP5框架与ThinkPHP3.2的对比区别

2543
来自专栏黑白安全

宽字节注入详解分析

简介  宽字节注入,它的作用可以绕过转义,也是绕过转义的其中一个办法  宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_...

5712
来自专栏蓝天

C/C++常见gcc编译链接错误解决方法

用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例: -Wl,-Bstatic -lmysq...

3353
来自专栏马洪彪

Java设计模式(一)工厂模式

一、场景描述 仪器数据文件的格式包含Pdf、Word、Excel等多种,不同种格式的文件其数据的采集方式不同,因此定义仪器数据采集接口,并定义PDF、Excel...

4119
来自专栏逆向技术

C语言第十二讲,文件操作.

在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样

5170
来自专栏Django Scrapy

python3 下调用zabbix api 获取多个机房的IP

根据工作的需要,需要查看监控中的所有ip,我们一共有三个机房,每个机房都部署了同样的zabbix监控 根据三个园区的 监控api的url 实现功能:不输入参数 ...

3685

扫码关注云+社区

领取腾讯云代金券