[英]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.