簡體   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