Jogi: Problem mit mysql_query

Hallo,

ich möchte eine Datenbank-Backup-Funktion für ein Unternehmen schreiben. Dazu setze ich die komplette Datenbank in SQL-Befehle um, die ich dann in einer Datei (der Dateiname ist der aktuelle UNIX-Timestamp) auf dem Server speichere. Das funktioniert soweit auch alles. Die erzeugten SQL-Befehle stimmen in einem Vergleich mit von PHPMyAdmin generiertem Code überein.

Das Problem ist: Beim Wiederherstellen, also dem Ausführen der abgespeicherten SQL-Befehle tritt folgender Fehler auf:

You have an error in your SQL syntax near '; CREATE TABLE cat\_english ( id int(11) NOT NULL auto_increment, cat\_nr in' at line 1

Ich kann dort aber keinen Syntax-Fehler entdecken! Und das kuriose: Führe ich aus dem generierten SQL-Code zwei Befehle hintereinander aus, funktioniert alles wie es soll.

Kann mir jemand erklären, warum das so ist und wie ich die Sache am besten löse?

Danke!

Gruß,
Daniel

  1. Moin!

    Das Problem ist: Beim Wiederherstellen, also dem Ausführen der abgespeicherten SQL-Befehle tritt folgender Fehler auf:

    You have an error in your SQL syntax near '; CREATE TABLE cat\_english ( id int(11) NOT NULL auto_increment, cat\_nr in' at line 1

    Sieht so aus, als würdest du mehr als einen SQL-Befehl mit mysql_query ausführen wollen. Das ist nicht erlaubt.

    Und auch PHPMyAdmin trennt beim Import eines Dumps die Befehle schön säuberlich auf und gibt sie einzeln in mysql_query.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Okay, das wird es wohl sein.
      Gibt es eine Stringfunktion, die mir den String mit den SQL-Befehlen in ein Array zerlegt? Um die einzelnen SQL-Befehle zu erhalten muss ich den String ja eigentlich nur an jedem Semikolon (";") trennen.

      1. Hallo,

        Zum zerlegen verwendest Du am besten explode();
        $queries = explode(";", $string);

        $queries ist dann ein Array mit allen SQL-Abfragen;

        Siehe auch hier: http://de.php.net/explode

        1. Hallo, danke für deine Antwort. Gerade im Moment habe ich diese Funktion bei php.net entdeckt ;-)

          Vielen Dank für eure Antworten!!!

        2. Hallo,

          Zum zerlegen verwendest Du am besten explode();
          $queries = explode(";", $string);

          $queries ist dann ein Array mit allen SQL-Abfragen;

          Siehe auch hier: http://de.php.net/explode

          Danke! Gerade im Moment hab ich diese Funktion auf php.net auch entdeckt ;-)

          Vielen Danke für eure Antworten!!! Einen schönen Tag wünsche ich noch.

          Gruß,
          Daniel

        3. Hi,

          $queries = explode(";", $string);

          VORSICHT! Ich dachte auch mal, das wäre so einfach:
          INSERT INTO nachrichten (autor, text) VALUES ('Rouven', 'Ereignis; Beschreibung');
          INSERT INTO nachrichten...

          Viel Spaß beim Splitten...

          MfG
          Rouven

          --
          -------------------
          Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
          1. Hi,

            $queries = explode(";", $string);
            VORSICHT! Ich dachte auch mal, das wäre so einfach:
            INSERT INTO nachrichten (autor, text) VALUES ('Rouven', 'Ereignis; Beschreibung');
            INSERT INTO nachrichten...

            Viel Spaß beim Splitten...

            MfG
            Rouven

            Ich habe folgende Lösung gefunden (und ich hoffe, das ist auch eine Lösung):

            Ich trenne den String normal an jedem Semikolon. Dann überprüfe ich beim Ausführen der Abfrage, ob sie erfolgreich ausgeführt wurde. Wurde sie nicht erfolgreich ausgeführt, so gehe ich davon aus, dass der SQL-Befehl nicht korrekt (z.B: unvollständig) ist, also z.B. sich innerhalb der Daten ein Semikolon befand. In diesem Falle ergänze ich zu dem unvollständigen SQL-Befehl einfach so lange die folgenden Teilstrings, bis der SQL-Befehl vollständig ist, d.h. bis die mysql_query()-Abfrage erfolgreich ausgeführt wird.

            1. Moin!

              Ich trenne den String normal an jedem Semikolon. Dann überprüfe ich beim Ausführen der Abfrage, ob sie erfolgreich ausgeführt wurde.

              Wie wäre es, wenn du einfach ein schlaueres Trennzeichen wählen würdest, welches garantiert nicht in einem SQL-String vorkommt.

              Sowas wie "Linefeed", auch bekannt als "\n"?

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hi,

                Sowas wie "Linefeed", auch bekannt als "\n"?

                das halte ich auch für gewagt. Es kommt natürlich auf die Speicherstruktur an, aber wenn ich Volltext aus einer Datenbank in eine Datei schreibe, dann kann mein Dumpfile plötzlich auch Linefeeds enthalten die zum Text gehören.

                MfG
                Rouven

                --
                -------------------
                Death is nature's way of telling you to slow down.
                1. Moin!

                  Sowas wie "Linefeed", auch bekannt als "\n"?
                  das halte ich auch für gewagt. Es kommt natürlich auf die Speicherstruktur an, aber wenn ich Volltext aus einer Datenbank in eine Datei schreibe, dann kann mein Dumpfile plötzlich auch Linefeeds enthalten die zum Text gehören.

                  Klar, im Abfrageergebnis ist natürlich der Zeilenumbruch wieder in Natura enthalten. Deswegen gibts ja so wunderschöne Funktionen wie mysql_real_escape_string(), die dafür sorgen, dass man beim Schreiben in die Datenbank solche Zeichen eben nicht in Natura in den SQL-String schreiben muß.

                  Wenn das Dumpfile also Zeilenumbrüche als Daten enthielte, dann ist es schlecht escapet.

                  - Sven Rautenberg

                  --
                  "Love your nation - respect the others."
      2. Moin!

        Gibt es eine Stringfunktion, die mir den String mit den SQL-Befehlen in ein Array zerlegt?

        RTFM!
        http://www.php.net

        Um die einzelnen SQL-Befehle zu erhalten muss ich den String ja eigentlich nur an jedem Semikolon (";") trennen.

        Das stimmt nur so lange, wie in deinen Daten kein Semikolon vorkommt! Andernfalls zerstörst du dir deine Querys.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
  2. Hallo Daniel,

    verwendest Du PHP um SQL zur Datenbank zu schicken?
    Du kannst mit mysql_query nur jeweils eine SQL Abfrage schicken.

    Entweder Du verwendest mysql_query() also einmal pro Abfrage oder Du schaust Dir mysqli (PHP5) an, dort gibt es eine multi-query Funktion: http://nz.php.net/manual/en/function.mysqli-multi-query.php

    Schoene Gruesse
    Anatol