Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2003 Teil von Juli

SELFHTML Forumsarchiv
*.sql Datei ausführen

Informationsseite
  1. Seite (PHP) *.sql Datei ausführen von mabu, 31. 07. 2003, 20:14
nach unten

*.sql Datei ausführen

Die folgende Nachricht zum Thema stammt von: mabu, 31. 07. 2003, 20:14

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

nach obennach unten

*.sql Datei ausführen

Die folgende Nachricht zum Thema stammt von: Sönke Tesch, 31. 07. 2003, 20:18

»» 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

nach obennach unten

*.sql Datei ausführen

Die folgende Nachricht zum Thema stammt von: mabu, 31. 07. 2003, 20:26

Ok, danke

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

nach obennach unten

*.sql Datei ausführen

Die folgende Nachricht zum Thema stammt von: mabu, 31. 07. 2003, 21:16

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?

nach obennach unten

*.sql Datei ausführen

Die folgende Nachricht zum Thema stammt von: Sönke Tesch, 01. 08. 2003, 09:37

»» $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

nach oben
Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2003 Teil von Juli

© 1998-2006 Seite Impressum, Software: Classic Forum