While循环和$sqlResult -> fetch_all(MYSQLI_ASSOC)的区别是什么?

7

不太确定为什么,但我今天已经多次看到这个问题。

global $connection;
$sql = "SELECT * FROM table";

$result = $connection->query($sql);

$rows = array();
while ($row = mysqli_fetch_assoc($result)) {

    $rows[] = $row;

}

return $rows;

为什么不直接使用内置的 fetch_all 函数?
global $connection;
$sql = "SELECT * FROM table";

$result = $connection->query($sql);

return $result->fetch_all(MYSQLI_ASSOC);

这样做是否可以省去while循环?有哪些优势?速度差异?

A) 开发者正在阅读一本旧的教程/书籍,这就是它所展示的方法。B) 这就是开发者所知道的全部。C) 他们喜欢它的外观。D) 如果开发者在循环之前没有检查返回结果是否存在错误(似乎大多数人都没有这样做),那么while版本不会像foreach ($rows as $row)那样抛出错误。还可以继续... - Rottingham
1
B) - 这绝对是不可接受的。 "开发人员" 应该了解他在工具箱中拥有什么。如果你能继续前进,那就继续吧? - Joe
1
while 只会一次处理一条记录的副本,而 foreach() 会同时保留整个结果集和每条记录的副本,因此内存占用更小。虽然今天这种差别相当微不足道,但在处理大数据集时会有所体现。 - Rottingham
2个回答

2
已经有一些有效的陈述了...但是为了补充mysqli_fetch_all文档(http://www.php.net/manual/en/mysqli-result.fetch-all.php)上的内容:
“由于mysqli_fetch_all()一次性将所有行作为数组返回,因此它可能会消耗比一些类似函数(如mysqli_fetch_array(),它仅从结果集中一次返回一行)更多的内存。此外,如果您需要迭代结果集,则需要一个循环结构,这将进一步影响性能。出于这些原因,mysqli_fetch_all()应仅在将提取的结果集发送到另一层进行处理的情况下使用。”
粗体部分意味着,如果他在每个fetch_assoc之后执行某些处理:
while ($row = mysqli_fetch_assoc($result)) {

     $rows[] = $row;
     ... //im doing stuff with $row here

}

他可以获得比使用mysqli_fetch_all函数更好的性能(该函数必须循环获取所有行,然后再进行另一个循环以处理每一行)。
至于其他一些速度分析,这篇博客文章 -> http://blog.ulf-wendel.de/2007/php-mysqli_fetch_all/有点过时(2007年),但对比较这两种方法做了不错的工作。

1

可能是在$mysqli出现之前实施的,然后$mysqli出现了,带来了fetch_all功能,开发人员懒惰地发现这是更新代码最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接