Php mysqli_store_result()与mysqli_use_result()之比较 问题

Php mysqli_store_result()与mysqli_use_result()之比较 问题,php,mysqli,Php,Mysqli,和之间有什么区别 故事 含糊不清的文件 PHP.net上的文档对于两者之间的区别似乎非常模糊。-page不提供任何代码示例,并将您链接到-page以查找它们。在该页中给出了以下代码示例(完整代码请参见该页): -页面使用完全相同的代码示例,但有一个例外: /* store first result set */ if ($result = $mysqli->use_result()) { 嗯存储结果变成了使用结果。注意,即使上面的评论仍然是“商店” 更让人困惑的是 看过代码示例后,我想;

和之间有什么区别

故事 含糊不清的文件 PHP.net上的文档对于两者之间的区别似乎非常模糊。-page不提供任何代码示例,并将您链接到-page以查找它们。在该页中给出了以下代码示例(完整代码请参见该页):

-页面使用完全相同的代码示例,但有一个例外:

/* store first result set */
if ($result = $mysqli->use_result()) {
嗯<代码>存储结果变成了
使用结果
。注意,即使上面的评论仍然是“商店”

更让人困惑的是 看过代码示例后,我想;“好吧,这是个别名。”。但是等等!本文件给出了以下说明:

  • -传输上一次查询的结果集
  • -启动结果集检索
它们看起来是两种不同的东西,根本不像别名。仔细看一看,我发现在-page的代码示例中还有另一个异常:
$result->free()变成
$result->close()。然而,当我在第二个代码示例(程序等效)的同一页上发现,
mysqli\u free\u result($result),而不是预期的
mysqli\u close\u结果($result)

mysqli::store_result()
将从MySQL服务器获取整个结果集,而
mysqli::use_result()
将逐个获取行

这也在链接到的
mysqli::use_result
文档中提到:

mysqli_use_result()函数不会从数据库传输整个结果集,因此不能使用诸如mysqli_data_seek()之类的函数移动到集合中的特定行。要使用此功能,必须使用mysqli_store_result()存储结果集。如果在客户端执行大量处理,则不应使用mysqli_use_result(),因为这将占用服务器并阻止其他线程更新从中提取数据的任何表


您通常可以始终使用mysqli::store_result()
,除非您有充分的理由不立即从服务器读取所有行。

use_result
返回一个未缓冲的结果


store\u result
返回一个缓冲的结果。

我认为这种细化可能有助于人们从支持通过数组或枚举器检索的语言中获取信息。因为这就是区别

对于.NET,它与(存储结果)和(使用结果)(以及文件/DbResult/CSV解析/XML解析等价物)的区别相同

枚举器变量使用较少的(PHP)客户端内存,并且在处理当前行时,可能会在后台异步获取下一行,从而使其在客户端上具有更大的内存和处理时间。以占用(SQL)服务器资源更长时间为代价(因为结果集尚未完全传输)

反过来,get/array方法将在一次阻塞操作中检索数据,占用更多的客户端内存,以便更早地释放DB内存

就个人而言,我会默认使用非枚举器方式,除非您实际遇到(客户端)内存问题

在.NET中,如果遇到x32进程的2/3 GiB限制,则必须使用枚举器。文件的特定枚举行在这里很重要。
对于DB结果,它不应该碰巧从开始。2 GiB DB的结果要么是过滤不足(在查询中进行更多过滤),要么包含大量blob(如果可能,您应该逐段加载,甚至让浏览器通过http处理程序进行检索)。

Ah,因此,基本上进行后续的
use\u result
调用要繁重得多,因为php必须查询服务器上resultset中的每个结果,而使用
store\u result
在第一次调用后,所有结果都将存储在php端,后续调用只会从php请求结果?是的,我很喜欢php.net上的例子,上面的注释是
,如果我们必须检索大量数据,我们使用MYSQLI\u use\u RESULT
什么是
大量数据
?这个术语是非常相对的,比如说亚马逊的数据库比我整个5 Mb的数据库都要大。那么,
get_result
do做什么呢?@amaster507在返回值部分的页面上找到了有趣的注释:
。。。成功调用mysqli_query()后返回FALSE可能会导致结果集太大(无法分配内存)
,这意味着如果没有足够的内存来缓冲所有预期数据,那么应该使用PHP的默认方法?例如,如果我没有在准备好的语句上执行store_result()或在execute()和fetch()之前使用_result()。我假设是use_result(),因为mysqli_stmt对象上没有use_result()。@crush否,默认值是mysqli_STORE_result
/* store first result set */
if ($result = $mysqli->use_result()) {