如何使用 fetch() 获得与 fetchAll() 相同的结果?

Posted

技术标签:

【中文标题】如何使用 fetch() 获得与 fetchAll() 相同的结果?【英文标题】:How can I get with fetch() the same results then with fetchAll()? 【发布时间】:2018-10-24 07:37:10 【问题描述】:

我正在使用 fetchAllmysql 数据库中选择数据:

 $sql = "SELECT id, dateTime, fileName, path, size FROM files WHERE project = ?"; 
 $q = $pdo->prepare($sql);
 $q->execute([$id]);
 $result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);

数组如下所示:

array(2) 
  ["10002E41F35560F492298F50D14B03A1"]=>
  array(5) 
    ["dateTime"]=>
    string(19) "2016-10-12 19:46:25"
    ["fileName"]=>
    string(10) "monkey.jpg"
    ["path"]=>
    string(59) "Volumes/KFS18050001/18050001/elephant/cat/monkey/monkey.jpg"
    ["size"]=>
    string(7) "8650752"
  
  ["10008A76CEE6BEEEB8000891094A2931"]=>
  array(5) 
    ["dateTime"]=>
    string(19) "2016-10-12 14:39:43"
    ["fileName"]=>
    string(9) "horse.jpg"
    ["path"]=>
    string(51) "Volumes/KFS18050001/18050001/elephant/cat/horse.jpg"
    ["size"]=>
    string(7) "8306688"
  

但是当我的数据库中有超过 500.000 个条目时,这对系统来说太多了。未创建数组。它加载很长时间,然后我得到一个空白页。我尝试使用fetch 而不是fetchAll

 $sql = "SELECT id, dateTime, fileName, path, size FROM files WHERE project = ?"; 
 $q = $pdo->prepare($sql);
 $q->execute([$id]);
 $result = $q->fetch(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);

使用fetch,我的系统可以处理 500.000 个条目。但现在我没有得到我需要的结果:

array(6) 
  ["id"]=>
  string(32) "10002E41F35560F492298F50D14B03A1"
  ["dateTime"]=>
  string(19) "2016-10-12 19:46:25"
  ["fileName"]=>
  string(10) "monkey.jpg"
  ["path"]=>
  string(59) "Volumes/KFS18050001/18050001/elephant/cat/monkey/monkey.jpg"
  ["size"]=>
  string(7) "8650752"

horse.jpg 只是不显示。而且 id 现在不是数组的键了。

有没有办法通过只使用fetch 来检索与fetchAll 相同的结果,或者有没有办法不让fetchAll 和大量条目使系统不堪重负?

【问题讨论】:

fetch 一次检索一行,因此您必须循环才能获得多个条目。但最终,如果你有 500,000 个合法结果,那么你就有 500,000 个结果。您需要显示所有这些吗?也许你可以做一些分页?也许 UI 需要重新设计以仅显示更具体的数据(例如,您需要更多搜索过滤器或其他东西)?没有任何上下文很难知道。 是 500 000 还是 500? @TrevorClarke 500000 @ADyson 我需要一个包含所有这些的数组。因为我需要将这个数组与另一个数组进行比较。我不知道数组块是否有助于解决这个问题 @Jarla 您可以使用 ->rowCount 计算行数并从中减去 x :) 【参考方案1】:

由于我非常怀疑您需要一次加载 500,000 张图像,因此建议您尝试以下方法。

我要做的是继续使用 fetchall() 但只从您当前需要的数据库中选择结果。如果您需要加载所有图片,假设您正在创建一个 Instagram 类型的程序,我建议您动态加载图片,并在向下滚动页面时每隔几百张图片查询一次数据库。

你可以在 mysql 中使用limit 来做到这一点:

SELECT ....query here.... LIMIT 0,100

一旦您的用户向下滚动了 80 张图片,请使用以下命令再次查询数据库:

 SELECT ....query here.... LIMIT 100,199

这样您就不会因为太多结果而使数据库或客户端系统过载。

【讨论】:

参赛作品不全是图片。这是不同种类的东西 我不加载页面上的数据。我只需要创建一个数组,我需要与另一个数组进行比较并检查它们是否相似 @Jarla 问题是 php 无法处理长度为 500 000 的数组。 是的,我明白了。我需要使用数组块吗? @Jarla 你肯定需要打破它。如果您确切地告诉我们您正在尝试做什么,我们或许可以完全想出另一个解决方案。

以上是关于如何使用 fetch() 获得与 fetchAll() 相同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

PDO中获取结果集之fetchAll()方法详解

PHP 中Fetch,FetchAll从数据库中取数据,遍历出来的都是字符串吗

将数组添加到 MySQL Fetch

fetchall与fetchone

fetchAll 的小小分析

fetchAll 的小小分析