2012-03-26 3 views
0

Ich bin hier mit einem eigenartigen Problem fest. Ich habe ein Skript, das im Prinzip eine CSV-Datei in eine Datenbank importiert unter Verwendung fgetcsv() in PHP. Es ist überhaupt kein Problem, und ich kann alte Einträge auch mit der MySQL-Syntax ON DUPLICATE KEY UPDATE aktualisieren (ich bin in keiner Weise ein MySQL-Experte, daher frage ich hier).PHP MYSQL CSV importieren und dann redundante Einträge vergleichen und entfernen

ist hier, dass ein Teil des Codes:

$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'"); 

} 

Das alles funktioniert gut. Was ich festhalte, ist die Tatsache, dass einige Einträge möglicherweise aus der eigentlichen CSV entfernt wurden (da der Schlüssel möglicherweise nicht mehr existiert). Ich möchte die Einträge aus der MySQL-Tabelle entfernen, die in der CSV nicht mehr vorhanden sind.

Bedeutung, wenn $key aus CSV gegangen ist, entfernen Sie auch diese Zeile in der Datenbanktabelle. Ich nehme an, ich würde es tun, bevor ich die Insert/Update-Abfrage für die MySQL-Tabelle ausführen würde?

Ich würde jede Hilfe Jungs schätzen.

Antwort

0

Behalten Sie einfach einen Account Ihrer Schlüssel.

Speichern jedes $key in einem Array in Ihrem während und am Ende einer Abfrage ausführen, sagt

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

Ich verstehe die Logik hinter Ihrem Denken. Könnten Sie ein wenig mehr iterieren und mir zeigen, wie dieser Code aussehen würde? Ich bin neu in PHP und schreibe expansiven Code wie folgt, ist irgendwie neu für mich. – privilegue

+0

Nun, es sollte nicht so schwer sein, also zögere ich, Ihnen nur die Codes zu geben, weil Sie sie einfach ausschneiden und einfügen können, und ich habe momentan keine echte Testmethode und/oder Zeit. aber eine schnelle. BERATEN WERDEN. Sie sollten es verwenden, um zu verstehen, was passieren soll, nicht kopieren! – Nanne

+0

Danke! Ich möchte nicht kopieren/einfügen Ich möchte es tiefer verstehen. Ich habe alles, was ich bisher weiß, von Syntaxbeschreibungen und Beispielen, die Menschen dort veröffentlicht haben, gelernt. Der einfachste Weg für mich selbst zu lernen, besteht darin, Beispiele zu sehen und dann zu replizieren und auf das, was ich gelernt habe, zu erweitern. – privilegue

0

ich etwas sehr ähnlich wie diese mit einer Partner-Website - mit nur unter 500.000 Produkte.

Fügen Sie in Ihrer Datenbank einfach eine weitere Spalte namens "update_flag" oder etwas Ähnliches hinzu. Setzen Sie den Standardwert auf 0. Wenn Sie Elemente aus der CSV-Datei hinzufügen, setzen Sie das Attribut update_flag auf "1". Setzen Sie das Feld in Ihrer "Doppelte Anweisung" auf "2". Ich ging auch und fügte 2 andere Felder hinzu: "date_added" und "date_updated".

Nachdem der Import abgeschlossen ist, können Sie die alten (zu löschenden), neu hinzugefügten und die aktualisierten Elemente zählen. Sie können dann einfach aus der Tabelle löschen, wo update_flag = 0

Ich hoffe, das hilft.

Verwandte Themen