哪一个mysql select 查询是好的?while and foreach

发布于 2022-09-11 19:12:02 字数 463 浏览 16 评论 0

我很好奇就 while 和foreach
要选择哪个才是对的呢?
我相信官方出了选择,应该是有用意?

$storeList = $do->query(
  "SELECT * FROM `store` "
);

if (sizeof($storeList) != 0) {
  foreach ($storeList as $row) {
    // do...
  }
}
$storeList = $do->query(
  "SELECT * FROM `store` "
);

if (mysqli_num_rows($storeList) != 0) {
  while ($row = mysqli_fetch_array($storeList)) {
    // do...
  }
}

这两个的差别会是在哪里?
哪个效率好?
且用途更多?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

输什么也不输骨气 2022-09-18 19:12:02

第一种呢?就是相当于把所有的数据全部由mysql推送给PHP,然后PHP循环进行处理。那么PHP占用的空间就看你获取的结果集的数量是多少了。

第二种呢?就跟PHP的迭代器似的,每次只获取一条,那么结果PHP占用的内存就只是一条记录的空间。

陈年往事 2022-09-18 19:12:02

原答案由于个人认知存在错误,给出了错误的解答,非常抱歉。

当 query 返回结果为 一个 mysql_result 对象。后 mysql_fetch_all 虽然鸭读出数据可以更直观的看到数据,但是这也有另一位答主提到的 迭代器,在查阅相关文档后确定。其次 因为 mysql 有两套驱动 ,在 Linux 下 因为驱动的问题还会存在 mysql_fetch_all 方法不存在的问题。
当然 因为实现了迭代器,两种方式都适用于 foreach ,这与使用的迭代的方式无关。


首先,你这两个 if 都是没必要的。
其次,原则上来说 取出所有结果集后再交给循环去遍历每一个项目是最快的,使用获取行相对要慢一些。


注意这里的一行,即并不适用于取多条数据,但是在一些上古时代的文章中,取多条数据很多人都还是采用的诸如

while($row=mysqli_fetch_assoc($query)){
    // TODO
}

这样的方式来循环结果集,直到结果集为空为值,但是在这整个过程中,每次都需要去调用 mysqli_fetch_assoc 这个方法来从语柄中拿出关联数组。

而,当我们需要多条数据的时,就应该主动的去使用 mysqli_fetch_all 这个方法来进行取出所有结果集的二维关联数组,而且这时候 无论我们使用哪种方式来循环遍历数据都无所谓。
但是最佳建议为 foreach ,诸如像代码中的空数组判断,这些对于 foreeach 来说都是非必要,内部会自动去处理。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文