*.sql Datei ausführen
mabu
- php
0 Sönke Tesch
Hi!
Ich habe mit phpmyadmin ein Datenbankbackup in einer *.sql Datei. Jetzt würde ich diese gerne mit einer PHP-Funktion auführen und so das gespeicherte in die Datenbank übertragen.
Z.B. in einem Installationsscript
Wie geht das?
Wäre echt super.
mfg,
mabu
Ich habe mit phpmyadmin ein Datenbankbackup in einer *.sql Datei. Jetzt würde ich diese gerne mit einer PHP-Funktion auführen und so das gespeicherte in die Datenbank übertragen.
Wie geht das?
"Mit _einer_ PHP-Funktion" garnicht. Du kannst die SQL-Datei entweder direkt an die mysql-Konsole übergeben (wenn Dir das nichts sagt, lass es) oder die SQL-Datei in PHP Zeile für Zeile auslesen und am mysql_query() übergeben (vier Zeilen, Fehlerprüfung nicht mitgerechnet).
Gruß,
soenk.e
Ok, danke
Das erste sagt mir nichts, also schau ich mir mal das Dateienauslesen an. Hört sich auch nicht allzu kompliziert an.
Hab das jetzt probiert, aber irgendwie funzts nicht...
Das ist mein Script:
<?PHP
$db_handle = mysql_connect
("localhost", "root", "");
$success = mysql_select_db
("scriptstest");
$file = fopen("file.txt","r");
$i=0;
while($zeile = fgetcsv($file,10000)) {
$erfolg=mysql_query("$zeile[0]",$db_handle);
if($erfolg) echo "Zeile ".$i." erfolgreich!<br>";
else echo "<font color=red>Zeile ".$i." Fehler!</font><br>";
$i++;
}
?>
Und das ein Teil der Datei:
DROP TABLE IF EXISTS mad\_settings
;
CREATE TABLE mad\_settings
(
title
text NOT NULL,
color\_background
text NOT NULL,
color\_tableheader
text NOT NULL,
color\_table1
text NOT NULL,
color\_table2
text NOT NULL,
color\_textheader
text NOT NULL,
color\_texttable
text NOT NULL,
color\_text
text NOT NULL,
font\_face
text NOT NULL,
font\_sizeheader
text NOT NULL,
font\_size
text NOT NULL,
color\_tableborder
text NOT NULL,
table\_size
text NOT NULL,
color\_link
text NOT NULL,
admin\_pw
text NOT NULL
) TYPE=MyISAM;
Es wird bei allen Zeilen Fehler gemeldet, außer bei den DROP TABLE. weil ja nicht alles in der selben Zeile steht, was zusammen gehört. Wenn ich es zusammenschreibe, gehts aber auch nicht...
Kann man die andere Möglichkeit vielleicht doch erklären oder hab ich einen Fehler gemacht?
$db_handle = mysql_connect
("localhost", "root", "");
$success = mysql_select_db
("scriptstest");
$file = fopen("file.txt","r");
$i=0;
while($zeile = fgetcsv($file,10000)) {
$erfolg=mysql_query("$zeile[0]",$db_handle);
DROP TABLE IF EXISTS
mad\_settings
;
CREATE TABLEmad\_settings
(
title
text NOT NULL,
color\_background
text NOT NULL,
[..]
hab ich einen Fehler gemacht?
Ja und nein, ich habe teilweise Mist erzählt, das hätte Dir aber eigentlich auffallen müssen: Die CREATE-Anweisung ist über mehrere Zeilen verteilt, Du kannst also schlecht jede Zeile einzeln und damit CREATE stückchenweise an mysql_query() übergeben.
Davon mal abgesehen weiß ich nicht so recht, was Du mit fgetcsv() willst? Das ist eine Funktion, um Datensätze aus einer nach einem bestimmten Muster formatierten Textdatei einzulesen (CSV: Comma Separated Values), mit normalen Dateien kann diese Funktion nicht viel sinnvolles anfangen. Benutze zum einfachen Zeileneinlesen fgets().
Die Fehlerprüfungen hinter _connect() und _select_db() hast Du sicherlich nur wegen der Übersichtlichkeit weggelassen, ebenso die immer wieder sehr informativen Hilfestellungen von mysql_error() in der Fehlerprüfung nach _query().
Aber zum Problem: Wir haben also eine Datei mit SQL-Befehlen, die teilweise über mehrere Zeilen gehen. Wenn Du mal genau hinschaust, wirst Du merken, daß alle Befehle grundsätzlich mit einem Semikolon enden. Der Code muß also lediglich so geändert werden, daß er solange alle Zeilen einliest und aneinanderklebt, bis er eine Zeile gefunde hat, die mit einem Semikolon endet. In etwa so (nur die Schleife):
$befehl=""; // hier wird der SQL-Befehl gesammelt
$sqlfehler=false; // zeigt an, ob $befehl in einem Fehler endete
while ((! $sqlfehler) && ($zeile=fgets($datei,1024))) // Zeile lesen
{
if ($befehl{0}!="#") // Kommentarzeilen beginnen AFAIR mit einem Nummernzeichen
{
$befehl.=(" ".trim($zeile)); // Zeile mit Leerzeichen an Befehl anhängen, Leerzeichen von $zeile abschneiden
if (substr($befehl,-1)==";") // Semikolon am Ende?
{
$sqlfehler=(! mysql_query($befehl,$db))
if ($sqlfehler)
echo htmlentities($befehl." - ".mysql_error($db));
$befehl=""; // $befehl für nächsten Durchgang leeren
}
}
}
Alle Befehle sind in der PHP-Anleitung beschrieben.
Kann man die andere Möglichkeit vielleicht doch erklären
An der Konsole
mysql [Benutzername und -passwort sowie Datenbankname] < befehle.sql
eingeben. Der Befehl ist in der MySQL-Anleitung beschrieben.
Gruß,
soenk.e