PHP:一次获取一个MySQL记录

时间:2011-04-28 20:23:45

标签: php mysql fetch

我制作了一个PHP脚本,用于创建来自名称的徽标,这些徽标来自具有数千条记录的MySQL数据库。

每个记录创建一个徽标可能需要几秒钟,因此整个过程需要几天时间。 我现在制作的剧本,预先获取所有数据,然后开始制作徽标。 但是当脚本运行时,尚未处理的记录中的数据可能会更改!

如何迭代结果集,同时在处理下一条记录时仍然获取最新数据?

这就是我现在使用的:

        $sql = "SELECT * FROM names";
        $mysqli = new mysqli($server, $user, $password, $database);
        if ($mysqli->multi_query($sql)) {
          do {
            if ($result = $mysqli->store_result()) {
              while ($record = mysqli_fetch_assoc($result)) {
                $records[] = $record
              }
              $result->close();
            } 
          } while ($this->DB->next_result());
        }
        foreach($records as $record) {
          //create the logo from $record['name']
        }

5 个答案:

答案 0 :(得分:4)

假设您对数据库中的每个条目都有唯一的ID,并且您确定该脚本可以“永久”运行,那么这样的事情应该有效:

$result = mysql_query('SELECT `id` FROM `logos`');
$ids = array();

while($id = mysql_fetch_row($result)){
    $ids[] = $id[0];
}

// we now have all the ids stored in an array which we'll loop through.

foreach($ids as $id){
    $result = mysql_query('SELECT * FROM `logos` WHERE `id`=' . $id);
    $row = mysql_fetch_assoc();

    // process
}

这是做什么的?好吧,我们首先获取当前驻留在数据库中的所有ID。我们将它们存储在变量中,循环遍历它并获取每行的最新数据。

正如其他人所说,你不能在同时拥有最新数据的同时迭代结果集。这是另一种选择。

答案 1 :(得分:1)

我可能会从最低的id开始逐个获取行,然后将该id增加1,直到达到最大ID。如果没有带有该ID的记录,只需跳转到下一个。

答案 2 :(得分:0)

那么当数据转换成图像时会发生什么?数据行是否保留在表格中?

不重要,您只需将LIMIT 1添加到SELECT的末尾,您就可以获得与您的请求匹配的第一个条目。

答案 3 :(得分:0)

你可以通过一次获得30行来妥协。您可以实现某种将任何更新的行添加到重做列表的机制。

编辑:

表格多久更新一次?结果集更改的一半与30ish更改不同。这是一次性的操作吗?如果经常这样做,那么你将一遍又一遍地浏览整个结果集,寻找变化。此外,如果你来到第987行,创建一个徽标,当你转到第1032行,有人会更改第987行,会发生什么?

如果更新活动是最小的,我会尝试获取整个结果集,创建更新触发事件以记录更改,执行所有徽标,然后根据日志记录返回并更新徽标。 (这可能有点矫枉过正。)

答案 4 :(得分:-1)

你不能。您需要一次一个地手动执行一行,每次查询一行。当您发出SELECT查询时,MySQL会缓冲结果。因此,当发出查询和获取行之间的数据发生变化时,您将获得旧的缓冲数据。

如果您不想为每一行运行查询,您可以简单地批量执行。例如,查询100条记录并对其进行处理。查询下一个100等等。