Problem mit mysql_query
Jogi
- datenbank
0 Sven Rautenberg0 Anatol
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
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
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.
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
Hallo, danke für deine Antwort. Gerade im Moment habe ich diese Funktion bei php.net entdeckt ;-)
Vielen Dank für eure Antworten!!!
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
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
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.
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
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
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
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
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