2012-03-26 34 views
0

我在這裏遇到了一個奇怪的問題。我有一個腳本,基本上使用php中的fgetcsv()將CSV文件導入數據庫。這樣做完全沒有問題,我可以使用MySQL語法ON DUPLICATE KEY UPDATE(我絕不是MySQL專家,因此我在這裏問)來更新舊條目。PHP MYSQL導入CSV,然後比較並刪除多餘的條目

這裏是那部分代碼:

$handle = fopen($file,"r"); 
fgetcsv($handle, 1000, ",");//skip first row since they are headers 
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop 
{ 
    //read array values into vars 
    $item1 = $fileop[0]; 
    $item2 = $fileop[1]; 
    $key = $fileop[2]; 
    // and a couple more 

    // now INSERT/UPDATE data in MySQL table 
    $sql = mysql_query("INSERT INTO table (item1,item2,key) 
    VALUES ('$item1','$item2','$key') 
    ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'"); 

} 

這一切工作正常。我所堅持的是,一些條目可能已經從實際的CSV中刪除(因爲在密鑰中可能不再存在)。我想要做的是從MySQL表中刪除不再存在於CSV中的條目。

含義如果$key已從CSV中消失,也會刪除數據庫表中的該行。我想我會在MySQL表上運行插入/更新查詢之前做到這一點?

我會很感激任何幫助球員。

回答

0

只需保留您的鑰匙的帳戶。

保存每一個$key在你而一個陣列,並在結束時運行一個查詢,說

DELETE FROM tabel WHERE key NOT IN (listofcommaseparatedkeysgoeshere) 

$arrayThatYouNeedToTest = array(); 
$handle = fopen($file,"r"); 
fgetcsv($handle, 1000, ",");//skip first row since they are headers 
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop 
{ 
    //read array values into vars 
    $item1 = $fileop[0]; 
    $item2 = $fileop[1]; 
    $key = $fileop[2]; 
    // and a couple more 

    // now INSERT/UPDATE data in MySQL table 
    $sql = mysql_query("INSERT INTO table (item1,item2,key) 
    VALUES ('$item1','$item2','$key') 
    ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'"); 

    $arrayThatYouNeedToTest[] = $key;  

} 

$stringThatYouNeedToInspect = implode(",",$arrayThatYouNeedToTest); 
$queryYouREALLYneedToCheckFirst = "DELETE FROM tabel WHERE key NOT IN (".$stringThatYouNeedToInspect.")"; 

//$result = mysql_query($queryYouREALLYneedToCheckFirst); 
+0

我明白你想法背後的邏輯。你可以重複一遍,並告訴我代碼是怎麼樣的?我是新來的PHP和寫這樣的擴展代碼,對我來說是新鮮的。 – privilegue 2012-03-26 13:11:29

+0

好吧,它不應該那麼難,所以我很猶豫,只是給你的代碼,因爲你可能只是剪切和粘貼它,我現在沒有真正的測試方法和/或時間。但很快。被告知。你應該用它來理解應該發生什麼,而不是複製它! – Nanne 2012-03-26 13:17:04

+0

謝謝!我不想複製/粘貼我想深入瞭解它。我已經瞭解了我所知道的所有內容,而不是從人們看到的語法描述和例子。我學習最簡單的方法是通過做/看例子,然後複製並擴展我所學到的東西。 – privilegue 2012-03-26 13:20:09

0

我做的非常相似,這與聯盟網站的東西 - 剛走低於500,000種產品。

在數據庫中,只需添加另一列名爲「update_flag」或類似的東西。將默認值設置爲0.在從CSV文件添加項目時,將update_flag設置爲「1」。在'重複聲明'中,將字段設置爲「2」。我也去了,並添加了2個其他領域:「date_added」和「date_updated」。

導入完成後,您可以計算舊項目(要刪除),新添加的項目和已更新的項目。你可以簡單地刪除表update_flag = 0

我希望這有助於。