Textdatei in variablen umwandeln
tunnel85
- php
Hallo zusammen.
Wir haben zu Zeit ein Gästebuch von einem kostenlosen Anbieter, ich möchte nun allerdings ein eigenes schreiben. Das stellt auch kein Problem da, allerdings möchte ich natürlich die bisherigen Einträge weiterhin im Gästebuch haben.
Die Einträge kann ich mir auch als Textdatei ausgeben lassen, allerdings steh ich gerade voll auf dem Schlauch und weiss nicht wie ich sie so verarbeiten kann, dass ich sie nachher per PHP in meine Datenbank eintragen kann.
Die Daten sind nach diesem Schema aufgebaut:
ENTRY 1 DATE 2004/08/22 17:40:20
IP=213.7.71.101
FIELD_NAME=<Name>
FIELD_EMAIL=<>
FIELD_HOMEPAGE=<>
FIELD_MESSAGE=<Hier der text>
FIELD_$COMMENT$=<Kommentare des moderators>
END_ENTRIES
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
usw.
das Datum könnte ich ja per preg_replace und dann strtotime wieder in einen timestamp umwandeln.
Aber wie verfahre ich dann mit den anderen Dateien, und wie kann ich sie dann mit einer Schleife in MySQL eintragen lassen.
Hoffe Ihr könnt mir weiterhelfen oder mir zumindest einen Link zu dem Thema geben.
Habe über die Suche nichts gefunden, muss aber auch sagen das ich gar nicht weiß wo nach ich suchen sollte.
Na ja,
vielen Dank schon mal im vorraus
Tunnel
das Datum könnte ich ja per preg_replace und dann strtotime wieder in einen timestamp umwandeln.
Aber wie verfahre ich dann mit den anderen Dateien, und wie kann ich sie dann mit einer Schleife in MySQL eintragen lassen.
wenn du mit preg_replace umgehen kannst, ist es ja wohl ein leichtes, auch die anderen daten entsprechen zu lesen oder umzuformen?
alles zwischen "FIELD_NAME=<" und dem nächsten ">" (nicht gierig/greedy) ist offenbar der name usw
schleife in mysql eintragen ist schlecht - forme das textfile um, so dass nur noch sql-abfragen drinnen vorkommen (inserts), wenn das fertig ist, schicke alle abfragen gleichzeitig an die datenbank
eine schleife ist schön und gut, aber durch das ewige query, nächstes query usw bei vielen datensätzen sehr langsam
schleife in mysql eintragen ist schlecht - forme das textfile um, so dass nur noch sql-abfragen drinnen vorkommen (inserts), wenn das fertig ist, schicke alle abfragen gleichzeitig an die datenbank
eine schleife ist schön und gut, aber durch das ewige query, nächstes query usw bei vielen datensätzen sehr langsam
Würde heissen ich muss nach jedem Eintrag ein Insert einsetzen???
Oder wie meinst Du das, dass ich alles auf einmal hochlade???
Danke für die flotte Hilfe
schleife in mysql eintragen ist schlecht - forme das textfile um, so dass nur noch sql-abfragen drinnen vorkommen (inserts), wenn das fertig ist, schicke alle abfragen gleichzeitig an die datenbank
eine schleife ist schön und gut, aber durch das ewige query, nächstes query usw bei vielen datensätzen sehr langsam
Würde heissen ich muss nach jedem Eintrag ein Insert einsetzen???
Oder wie meinst Du das, dass ich alles auf einmal hochlade???Danke für die flotte Hilfe
du nimmst folgendes file (gekürzt)
ENTRY 1 DATE 2004/08/22 17:40:20
IP=213.7.71.101
FIELD_NAME=<Name>
ENTRY 2 DATE 2004/08/22 18:40:20
IP=213.7.71.102
FIELD_NAME=<Name2>
und formest es so um bzw schreibst ein neues file, welches so aussieht:
INSERT INTO tabelle (id, time, ip, name) VALUES (1, '04-08-22 17:40:20', '213.7.71.101', 'Name');
INSERT INTO tabelle (id, time, ip, name) VALUES (2, '04-08-22 18:40:20', '213.7.71.102', 'Name2');
usw
wenn du dieses file fertig hast, machst du wie gewohnt eine abfrage mit mysql_query - als abfrage gibst du aber den kompletten fileinhalt an
in einer schleife würdest du jede zeile einzeln als insert an die datenbank schicken, das ist langsamer
wenn das file zu gross wird, kanns du das ding auch direkt am server einspielen oder phpmyadmin verwenden
mit dieser methode ist unter anderem auch das debuggen leichter da du im ausgabefile sofort auf einen blick siehst, ob die abfragen die du gebaut hast stimmen oder wos happert
okay, werde mich dann mal an die Arbeit machen!
Gehe aber davon aus das wir noch einmal voneinander lesen :-)
Hoffe aber das ich es so schaffe.
Danke für die gute Hilfe
Mahlzeit,
und formest es so um bzw schreibst ein neues file, welches so aussieht:
INSERT INTO tabelle (id, time, ip, name) VALUES (1, '04-08-22 17:40:20', '213.7.71.101', 'Name');
INSERT INTO tabelle (id, time, ip, name) VALUES (2, '04-08-22 18:40:20', '213.7.71.102', 'Name2');
Ich würde eher folgenden Dateiinhalt vorschlagen:
INSERT INTO tabelle (id, time, ip, name) VALUES
(1, '04-08-22 17:40:20', '213.7.71.101', 'Name'),
(2, '04-08-22 18:40:20', '213.7.71.102', 'Name2'),
(3, '04-08-22 19:40:20', '213.7.71.103', 'Name3'),
(4, '04-08-22 20:40:20', '213.7.71.104', 'Name4');
in einer schleife würdest du jede zeile einzeln als insert an die datenbank schicken, das ist langsamer
Naja. Bei Deinem Vorgehen machst Du zwar nur eine Verbindung zur Datenbank auf, setzt aber innerhalb dieser trotzdem mehrere einzelne Abfragen ab.
MfG,
EKKi
Ich würde eher folgenden Dateiinhalt vorschlagen:
INSERT INTO tabelle (id, time, ip, name) VALUES
(1, '04-08-22 17:40:20', '213.7.71.101', 'Name'),
(2, '04-08-22 18:40:20', '213.7.71.102', 'Name2'),
(3, '04-08-22 19:40:20', '213.7.71.103', 'Name3'),
(4, '04-08-22 20:40:20', '213.7.71.104', 'Name4');
oder so ;)
Naja. Bei Deinem Vorgehen machst Du zwar nur eine Verbindung zur Datenbank auf, setzt aber innerhalb dieser trotzdem mehrere einzelne Abfragen ab.
hoffentlich - ich hab schon codebeispiele gesehen in denen mysql_connect und _close innerhalb einer schleife ausgeführt wurden - ist bei 10 datensätzen vielleicht begrenzt sinnvoll (für was auch immer), aber bei 100 oder 1000 sicher hinderlich
auch wenn dem nicht so ist ist es eine konfigurationssache des sql servers ob er innerhalb einer verbindung jede abfrage als eigene transaktion sieht oder erst gemeinsam ausführt (das eigentlichen commit)
meine erfahrung hat gezeigt, dass die schleifenvariante im falle eines einmaligen datenimports meistens langsamer ist - zumal der vorteil wegfällt, die potentiellen abfragen vorher nochmal anzusehen
Hello,
meine erfahrung hat gezeigt, dass die schleifenvariante im falle eines einmaligen datenimports meistens langsamer ist - zumal der vorteil wegfällt, die potentiellen abfragen vorher nochmal anzusehen
Ein weiteres Probblem bei einem Multiinsert ist auch die Kontrollierbarkeit des Erfolges.
Ich würde untersuchen, ob man das übr eine stored Procedure elegant lösen kann (bei gleichzeitiger Erzeugung einer Protokolltabelle, eventuell sogar mit Historie)
Ein harzliches Glückauf
Tom vom Berg