2012-03-26 12 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から削除されている可能性があるということです(キーが存在しなくなる可能性があります)。私がしたいのは、もはやCSVに存在しないエントリをMySQLテーブルから削除することです。

意味$keyがCSVから削除された場合、データベーステーブルのその行も削除されます。私はMySQLテーブルのInsert/Updateクエリを実行する前にそれを行うと思いますか?

私は助けていただきありがとうございます。

答えて

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

+0

さて、それほど難しいことではありませんので、コードをカット&ペーストするだけなので、私はちょうどあなたにコードを与えることを躊躇しています、そして、私は本当のテスト方法や時間がありません。迅速なものです。助言されます。あなたはそれをコピーするのではなく、何が起こるべきかを理解するためにそれを使うべきです! – Nanne

+0

ありがとう!私はそれをより深く理解したいと思います。これまで私が知っていたことはすべて、構文記述と人々がそこに書いた例を見ることから学んだ。私が学ぶ最も簡単な方法は、例題を見て、次にレプリカを見て、私が学んだものを拡張することです。 – privilegue

0

私はアフィリエイトのウェブサイトで、この非常によく似何かを - ちょうど有します500,000以下の製品。

データベースには、「update_flag」などの名前の別の列を追加するだけです。デフォルトを0に設定します。CSVファイルからアイテムを追加するときは、update_flagを "1"に設定します。あなたの '重複声明'で、「2」になるようにファイルを設定します。私はまた、2つのフィールドを追加しました: "date_added"と "date_updated"。

インポートが完了したら、古いアイテム(削除対象)、新しく追加されたアイテム、および更新されたアイテムをカウントできます。これで、update_flag = 0のテーブルから単純に削除することができます

私はこれが役に立ちそうです。

関連する問題