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

相关文章

来自专栏腾讯Bugly的专栏

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

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

8607
来自专栏Seebug漏洞平台

Typecho 前台 getshell 漏洞分析

Typecho是一个简单,轻巧的博客程序。基于PHP,使用多种数据库(Mysql,PostgreSQL,SQLite)储存数据。在GPL Version 2许可...

44712
来自专栏java 成神之路

基于ReentrantLock发生死锁的解决方案

3056
来自专栏iKcamp

翻译 | 带你秒懂内存管理 - 第一部(共三部)

原文地址:A crash course in memory management 原文作者:Lin Clark 译者:黑黑 校对者:Bob 要理解为什么将 Ar...

2007
来自专栏小俊博客

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

2233
来自专栏编舟记

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

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

1893
来自专栏小樱的经验随笔

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

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

5095
来自专栏蓝天

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

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

2183
来自专栏Django Scrapy

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

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

3375
来自专栏运维

Python Elasticsearch API操作ES集群

关键是DSL语法的编写涉及查询与聚合可以通过kibana的visualize或者devtool先测试出正确语法,然后结合python对列表、字典、除法、字符串等...

1601

扫码关注云+社区