繁体   English   中英

PHP:一次获取一个 MySQL 记录

[英]PHP: fetch MySQL records one at a time

我制作了一个 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']
        }

假设您对数据库中的每个条目都有唯一的 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。 我们将它们存储在一个变量中,遍历它并获取每一行的最新数据。

正如其他人所说,您不能在同时拥有最新数据的同时迭代结果集。 这是替代方案。

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

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

没关系,您只需将 LIMIT 1 添加到 SELECT 的末尾,您就会得到与您的请求匹配的第一个条目。

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

编辑:

表多久更新一次? 结果集更改的一半与 30ish 更改不同。 这是一次性手术吗? 如果经常这样做,那么您将一遍又一遍地检查整个结果集,寻找变化。 此外,如果您来到第 987 行,创建一个徽标,当您移至第 1032 行时,有人更改了第 987 行,会发生什么?

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

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

如果您不想对每一行都运行查询,则可以简单地分批进行。 例如,查询 100 条记录并处理它们。 查询接下来的 100 个,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM