如何使用 fetch() 获得与 fetchAll() 相同的结果?
Posted
技术标签:
【中文标题】如何使用 fetch() 获得与 fetchAll() 相同的结果?【英文标题】:How can I get with fetch() the same results then with fetchAll()? 【发布时间】:2018-10-24 07:37:10 【问题描述】:我正在使用 fetchAll
从 mysql 数据库中选择数据:
$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() 相同的结果?的主要内容,如果未能解决你的问题,请参考以下文章