79 Stimmen

Laden von .sql-Dateien aus PHP heraus

Ich erstelle ein Installationsskript für eine Anwendung, die ich gerade entwickle, und muss Datenbanken dynamisch aus PHP heraus erstellen. Ich habe es geschafft, die Datenbank zu erstellen, aber jetzt muss ich mehrere .sql-Dateien laden. Ich hatte geplant, die Datei zu öffnen und mysql_query eine Zeile nach der anderen abzufragen - bis ich mir die Schemadateien ansah und feststellte, dass sie nicht nur eine Abfrage pro Zeile sind.

Wie lade ich also eine SQL-Datei aus PHP heraus (wie phpMyAdmin es mit seinem Import-Befehl tut)?

1voto

Einige PHP-Bibliotheken sind in der Lage, eine SQL-Datei mit mehreren SQL-Anweisungen zu analysieren, sie richtig zu entschlüsseln (natürlich nicht mit einem einfachen ";") und sie dann auszuführen.

Prüfen Sie zum Beispiel Phing 's PDOSQLExecTask

1voto

Lorenz Lo Sauer Punkte 22044

Um das Problem noch einmal für alle zu verdeutlichen:

PHP's mysql_query, beendet automatisch jeden SQL-Befehl und ist darüber hinaus in seinem Handbuch sehr vage, dies zu tun. Alles, was über einen Befehl hinausgeht, führt zu einem Fehler.

Auf der anderen Seite funktioniert mysql_query auch mit einer Zeichenkette, die Kommentare im SQL-Stil enthält, \n , \r..

Die Einschränkung von mysql_query zeigt sich darin, dass der SQL-Parser das Problem direkt beim nächsten Befehl meldet, z.B.

 You have an error in your SQL syntax; check the manual that corresponds to your
 MySQL server version for the right syntax to use near 'INSERT INTO `outputdb:`
 (`intid`, `entry_id`, `definition`) VALUES...

Hier ist eine schnelle Lösung: (gut formatiertes SQL vorausgesetzt;

$sqlCmds = preg_split("/[\n|\t]*;[\n|\t]*[\n|\r]$/", $sqlDump);

1voto

SamGoody Punkte 12604

Bei vielen Hosts ist es nicht möglich, eine eigene Datenbank mit PHP zu erstellen, aber Sie scheinen das Problem gelöst zu haben.
Sobald die DB erstellt ist, können Sie sie einfach bearbeiten und befüllen:

mysql_connect("localhost");
mysql_query("SOURCE file.sql");

1voto

K B Punkte 11

Keine der Lösungen, die ich hier gesehen habe, befasst sich mit der Notwendigkeit, das Begrenzungszeichen zu ändern, während eine gespeicherte Prozedur auf einem Server erstellt wird, auf dem ich nicht auf den Zugriff auf LOAD DATA INFILE zählen kann. Ich hatte gehofft, dass jemand dieses Problem bereits gelöst hat, ohne dass ich den phpMyAdmin-Code durchforsten muss, um es herauszufinden. Wie andere auch war ich auf der Suche nach einer anderen GPL-Lösung, da ich selbst GPL-Code schreibe.

0voto

Chip Punkte 11

Ich benutze das ständig:

$sql = explode(";",file_get_contents('[your dump file].sql'));// 

foreach($sql as $query)
 mysql_query($query);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X