【问题标题】:PHP: fetch MySQL records one at a timePHP:一次获取一条 MySQL 记录
【发布时间】:2011-04-29 04:57:33
【问题描述】:

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

【问题讨论】:

    标签: php mysql fetch


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我会建议类似的事情,但在操作完成时添加一个额外的字段“done”更新为 true。然后是 LIMIT 1 和 WHERE done=false 的新 SELECT。我猜应该这样做。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        编辑:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-13
            • 1970-01-01
            • 1970-01-01
            • 2017-05-23
            • 2019-12-28
            相关资源
            最近更新 更多