tunnel85: Textdatei in variablen umwandeln

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:

---------------------------- Eintrag 1 ---------------------------------

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

---------------------------- Eintrag 2 ---------------------------------

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

  1. 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

    1. 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

      1. 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

        1. 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

        2. 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

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. 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

            1. 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

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de