2011-06-08 62 views
0

我有一個Linux系統中被捕獲數據,創建文件,並存儲關於在MySQL表中的文件數據。我需要能夠選擇性地修剪那些數據。刪除文件和行從一個MySQL結果集

我正打算使用PHP-CLI腳本,並通過cron夜間運行它。

的基本前提是要選擇符合標準的缺失行,從匹配的行刪除的文件,然後刪除行。路徑/文件名存儲在該行中。

我發現下面的查詢,以放心地選擇,然後刪除該行,但我需要從文件系統刪除文件的結果,以及:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
START TRANSACTION; 
SELECT foo FROM bar WHERE wee = 'yahoo!'; 
DELETE FROM bar WHERE wee = 'yahoo!'; 
COMMIT; 

我知道我可以刪除文件使用php的unlink()函數。我只是不知道如何保留結果集,通過刪除文件進行迭代,然後從表中刪除結果集行......沒有寫入臨時文本文件或其他東西的大難題。

任何幫助,將不勝感激。謝謝!

編輯:PHP 5.3.6,MySQL的5.0.77

+0

Ehm。我真的沒有看到問題。事務處理確保它將選擇並刪除該行,並且'unlink();'函數可以工作。你怎麼了 ? – genesis 2011-06-08 20:32:18

回答

0

我不認爲你需要一個交易如果你是剛剛推出1 DELETE查詢。

<?php 

    $pdo::prepare("SELECT [...]"); 
    foreach($result as $pathname) { 
     unlink($pathname); 
     if (/*everything went good*/) 
     $pdo::prepare("DELETE [...]"); 
    } 


?> 
0

我想你其實沒有問題。您可以選擇所有記錄並迭代它們。一旦查詢被執行,您可以遍歷結果集中的每個記錄,即使您使用第二個查詢刪除它們。結果集在迭代時保存在內存中。

所以,只要查詢(在一個查詢,如果possble),這些記錄都將被刪除。在每次迭代中,刪除該文件並刪除該記錄。

唯一的「問題」是文件系統未在相同的事務中的SQL語句進行交易,所以如果有錯誤而刪除的記錄,該文件可能仍然被刪除,反之亦然。

因爲我認爲,使用的文件應始終明確地檢查文件是否存在該應用程序,這將是最好先清理的文件。如果您先刪除文件,請檢查它是否被刪除,然後才刪除記錄,您可以確保文件始終被刪除。如果在刪除記錄時發生錯誤,您可以隨時再次查詢以再次嘗試。如果您先刪除記錄,則可能會收到一個意外未刪除文件的樹,不必佔用磁盤空間。