mabu: *.sql Datei ausführen

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

  1. 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

    1. Ok, danke

      Das erste sagt mir nichts, also schau ich mir mal das Dateienauslesen an. Hört sich auch nicht allzu kompliziert an.

    2. 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?

      1. $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