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)?

10voto

phatduckk Punkte 1765

mysqli kann mehrere Abfragen ausführen, die durch ein ;

können Sie die gesamte Datei einlesen und sie auf einmal ausführen, indem Sie mysqli_multi_query()

Aber ich werde der Erste sein, der sagt, dass dies nicht die eleganteste Lösung ist.

5voto

SchizoDuckie Punkte 9293

Mein Vorschlag wäre, sich den Quellcode von PHPMyBackup anzusehen. Es ist ein automatischer PHP-SQL-Lader. Sie werden feststellen, dass mysql_query nur eine Abfrage auf einmal lädt, und Projekte wie PHPMyAdmin und PHPMyBackup haben bereits die harte Arbeit für Sie erledigt, das SQL auf die richtige Weise zu parsen. Bitte erfinden Sie das Rad nicht neu :P

4voto

olle Punkte 1186
mysql_query("LOAD DATA LOCAL INFILE '/path/to/file' INTO TABLE mytable");

4voto

sanneo Punkte 365

Eine aktualisierte Lösung der Plahcinski-Lösung. Alternativ können Sie auch fopen und fread für größere Dateien verwenden:

$fp = file('database.sql', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$query = '';
foreach ($fp as $line) {
    if ($line != '' && strpos($line, '--') === false) {
        $query .= $line;
        if (substr($query, -1) == ';') {
            mysql_query($query);
            $query = '';
        }
    }
}

3voto

cam8001 Punkte 1502

Sind Sie sicher, dass es nicht eine Abfrage pro Zeile ist? Ihr Texteditor kann Zeilen umbrechen, aber in Wirklichkeit kann jede Abfrage in einer einzigen Zeile stehen.

Auf jeden Fall scheint die Methode von Olle die beste zu sein. Wenn Sie Gründe haben, Abfragen nacheinander auszuführen, sollten Sie in der Lage sein, Ihre Datei Zeile für Zeile einzulesen und dann das Semikolon am Ende jeder Abfrage zur Abgrenzung zu verwenden. Es ist viel besser, eine Datei zeilenweise einzulesen, als zu versuchen, eine riesige Zeichenkette aufzuteilen, da dies den Speicher Ihres Servers schont. Beispiel:

$query  = '';
$handle = @fopen("/sqlfile.sql", "r");

if ($handle) {
    while (!feof($handle)) {
        $query.= fgets($handle, 4096);

        if (substr(rtrim($query), -1) === ';') {
            // ...run your query, then unset the string
            $query = '';
        }
    }

    fclose($handle);
}

Natürlich müssen Sie Transaktionen und den Rest berücksichtigen, wenn Sie eine ganze Reihe von Abfragen in einem Batch ausführen, aber für ein Neuinstallationsskript ist das wahrscheinlich keine große Sache.

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