gpt4 book ai didi

php - 创建 PDO 迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:53:00 26 4
gpt4 key购买 nike

我在流动this创建数据库迭代器的文章。我有类似的表格和记录。但是当我执行时,我得到了空白页。我认为关于 $data = new DbRowIterator($stmt); 的问题,它没有返回正确的迭代器来运行 FilterIterator 类中的 accept 方法。我正在使用 Laravel

最佳答案

这篇文章是一个恶作剧。它声称所提供的技术可以加速使用 PDO 的数据库调用,但实际上它会显着降低它们的速度。

它所依据的前提也是错误的。 PDOStatement 已经可以遍历,您不需要任何技巧就可以使用 foreach 遍历 PDOStatement。

基准测试部分(经常发生)是一个公然的骗局。这家伙正在比较 fetchAll(),这显然会消耗大量时间/内存,并且一次只能获取一行。即使这样,他的时机也比正确的解决方案差得多。

写这篇文章的人不懂 PDO,更糟糕的是,不懂 SQL。

他发明的一切已经存在在 PDO 和 SQL 中:

  1. PDOStatement 已经可以遍历。无需重新发明轮子。
  2. 最重要的部分:过滤必须在 SQL 中完成,而不是在 PHP 中。这是教科书规则。如果您只需要 250000 条记录中的 63992 条,则首先应该只选择 63992 条。如果你让数据库为你选择记录,那将是无与伦比的速度。

因此,要获得这个人如此努力编写的所有内容,您只需要使用 PDO 的几行

$period = date_create("last_week")->format('Y-m-d 00:00:00');
$sql = 'SELECT * FROM `gen_contact` WHERE contact_modified > ? ORDER BY `contact_modified` DESC';
$stmt = $pdo->prepare($sql);
$stmt->execute([$period]);
foreach ($stmt as $row) {
echo sprintf(
'%s (%s)| modified %s',
$row->contact_name,
$row->contact_email,
$row->contact_modified
) . PHP_EOL;
}

而且这段代码将快很多倍,因为它在数据库级别进行过滤,而不是获取整个表,然后在 PHP 端进行过滤。

根据您收到的错误,只有 set PDO in exception mode并注意常规的 PHP 错误。

关于php - 创建 PDO 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39410722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com