Datensätze vergleichen
Dev
- datenbank
0 Michael Schröpl0 Dev
0 Mathias0 Dev
Hallo,
ich brauche dringend Hilfe. Ich will meine Logfiles in die DB übernehmen. Soweit kein Problem. Ich möchte aber verhindern das diese versehntlich doppelt eingtragen werden.
Diese Script liest die Datei aus
$line = 1;
$del = ";";
$fp = fopen ($file,"r");
while ($data = fgetcsv ($fp, 200, $del))
{
Hier steht dann die DB abfrage (zwischendrin ist noch anderer Code)
$result1 = mysql_query("SELECT + FROM daten WHERE filename='$file_name' AND datum ='$datum'",$con);
$row1 = mysql_fetch_row($result1);
... hier soll der Vergleich passieren
$line++;
}
Bei diesem Script wird immer nur die erste Zeile verglichen,
sobald etwas gleich ist, bricht er die Eintragung ab. Bei eine WHILE-Anweisung [ while ($row1 = mysql_fetch_row($result1))]
wird bei z.B. 10 Datensätzen in der Datei auch die DB 10mal durchlaufen und ich habe dann fast 100 statt nur 10 Einträge drin stehen.
Wer kann mir dabei helfen oder mir einen Tipp geben wie ich es anders machen kann, so das jedes File nur einmal vollständig eingetragen werden kann, oder wenn Datensätzte fehlen nachgetragen werden.
Danke schon im Voraus!!
Gruss
Dev
Hi Dev,
ich brauche dringend Hilfe. Ich will meine Logfiles in die DB übernehmen. Soweit kein Problem. Ich möchte aber verhindern das diese versehntlich doppelt eingtragen werden.
Ein Problem, das gar nicht erst entstehen kann, läßt sich meistens besonders elegant beheben. ;-)
Versuche nicht, Dein Problem algorithmisch zu lösen - löse es durch Datenmodellierung:
Definiere eine eindeutige Identität eines jeden Datensatzes und lege einen UNIQUE INDEX über dieses Feld Deiner Datenbanktabelle. Und dann behandele DUPLICATE KEY-Ereignisse beim INSERT.
Viele Grüße
Michael
Hi Michael,
Versuche nicht, Dein Problem algorithmisch zu lösen - löse es durch Datenmodellierung:
Definiere eine eindeutige Identität eines jeden Datensatzes und lege einen UNIQUE INDEX über dieses Feld Deiner Datenbanktabelle. Und dann behandele DUPLICATE KEY-Ereignisse beim INSERT.
Kannst du mir das bitte an einem Bsp. oder verdeutlichen, soviel Erfahrung habe ich mit php umd Mysql noch nicht.
Gruss
DV
Hi,
mal angenommen, in deiner Logdatei stehen folgende Daten:
filename;datum;etc1;etc2;...
Jetzt machst Du folgende DB-Abfrage:
$result1 = mysql_query("SELECT * FROM daten WHERE filename='$data[0]' AND datum ='$data[1]'",$con);
if (mysql_num_rows($result1) <= 0) //nicht in Tabelle vorhanden!
{
Datensatz in Tabelle einfügen...
}
$line++;
Wichtig ist, dass Du bei der SELECT-Anweisung im WHERE Teil die Attribute nimmst, die gerade einen Schlüssel bilden. D.h. diese oder dieses Attribut identifizieren einen Eintrag (Tupel) in deiner Tabelle eindeutig. Wenn es eine solche Teilmenge nicht gibt, dann musst Du alle Attribute abfragen, die bilden nämlich immer einen, wenn auch meist redundanten, Schlüssel. (Ein Attribut ist bei dir Z.B. filename oder datum...)
Hi Mathias,
die Variable filename wird gebildet ist als nicht in der Datei, sie dient der Dateiindetifizierung, Datum ist ein Teil der Logfile.
Viele Daten in dem File sind identisch. So das eigentlich nur die URL (seite auf die zugeriffen wurde) nicht immer identisch ist.
Warscheinlich versuche ich das Pferd nur falsch aufzuzäumen.
Wenn ich deine Anmweisung und Erläuterung richtig verstehe, soll ich einen Schlüsseö bilden, welcher als Teilmenge nicht vor kommt.
Und die DB Zeileweise durchlaufen?
Ist irgewie einleuchtend. Ich werdes mal versuchen.
Gruss
DEV