【问题标题】:Real time loop issue实时循环问题
【发布时间】:2012-09-04 05:07:04
【问题描述】:

我在存档实时循环时遇到问题。在进行下一次迭代时,它应该在进行下一次迭代之前首先检查status 是否有更新(status= 0)。

状态字段可能会在其他地方更新...

例如:

<?php
$SQL = "SELECT * FROM data WHERE status = 0";
$query = $db->prepare($SQL);
$query->execute();

while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    print_r($row);
    print("\n\n");
    sleep(5);
}
?>

当 php 脚本正在运行/循环时,在 mysql 控制台中,我很快做到了:

UPDATE data SET status = 1

即使我更新了状态,它仍然显示所有记录。如何解决这个问题?

【问题讨论】:

  • 不可能...!考虑使用LIMIT OFFSET, COUNT运行多个查询

标签: php mysql pdo


【解决方案1】:

结果集只计算一次。如果要查看中间更新,则需要发出另一个 SELECT 语句。

【讨论】:

  • while 循环中的另一个 SELECT 语句?
  • 如果您要稍等片刻然后查找更改的记录,则需要再次执行整个查询/获取周期。
  • 当我添加 $query->execute();在 fetch 循环中,它工作正常
  • 这是有道理的。 $query-&gt;execute(); 从一开始就重做您的查询。但是,您一次永远不会得到超过一排。
【解决方案2】:

当您进入您早已离开数据库的 while 循环时,您现在只是显示发回的内容。

【讨论】:

  • 是的,我明白了,我的问题是如何才能看到中间更新。
  • 像建议的那样,获取超集(您要显示的项目的 ID),然后循环它们并再次重新查询......这不是最好的方式。这仍然可能意味着有人可能会在您显示后更新。您也可以按照自己的方式进行操作,但使用 jquery 并定期刷新它作为替代方案。
【解决方案3】:

每次要获取新鲜数据时,都必须重新查询数据库。否则,您只会重新迭代旧的提取数据。

<?php
$SQL = "SELECT * FROM data WHERE status = 0";

while (true) { // set the condition you need here (eg: time)

    // I don't know PDO enough to know if prepare can be executed out of the loop
    $query = $db->prepare($SQL);

    // re-query the database to get the new statuses
    $query->execute();

    // process the data
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
        print("\n\n");
    }

    // sleep when all the row have been processed
    sleep(5);
}
?>

【讨论】:

  • 这实际上不符合我的要求。这将一次又一次地循环获取循环。我要同时运行多个脚本。我把 $query->execute();在 fetch 循环中,它似乎工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多