Sönke Tesch: *.sql Datei ausführen

Beitrag lesen

$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 TABLE mad\_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