2011-04-28 110 views
1

我已經創建了一個PHP腳本,可以從名稱創建徽標,這些名稱來自具有數千條記錄的MySQL數據庫。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'] 
     } 

回答

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

你不能。您需要手動逐步執行一行,每次查詢一行。當您發出SELECT查詢時,MySQL會緩存結果。因此,當發佈查詢和獲取行之間的數據發生變化時,您將獲得舊的緩衝數據。

如果你不想爲每一行運行一個查詢,你可以簡單地分批進行。例如,查詢100記錄並處理它們。查詢下一個100,等等。

0

那麼當數據被轉換成圖像時會發生什麼?數據行停留在表中?

沒關係,你可以在你的SELECT的最後添加LIMIT 1,你會得到符合你請求的第一個條目。

1

我可能會從最低的id開始逐行讀取行,然後只是將該id加1,直到達到最大的id。如果沒有該ID的記錄,只需跳到下一個。

+1

我會建議一個類似的東西,但添加額外的字段「完成」更新爲true時,操作完成。然後一個新的SELECT與LIMIT 1和一個WHERE done = false。應該這樣做,我想。 – Erik 2011-04-28 21:18:01

0

你可以通過一次獲得30行來妥協。您可以實現某種機制,將任何更新的行添加到重做列表中。

編輯:

表多久更新一次?結果集的一半變化與30變化不同。這是一次性操作嗎?如果經常這樣做,那麼你會一遍又一遍地瀏覽整個結果集,尋找變化。另外,如果你來到987行,創建一個標誌,當你移動到第1032行時,會發生什麼情況?有人改變行987?

如果更新活動很少,我會嘗試獲取整個結果集,創建更新觸發事件以記錄更改,執行所有徽標,然後返回並根據日誌記錄更新徽標。 (這可能是矯枉過正。)