Backup einlesen

mille

Erfahrenes Mitglied
Hallo!

Ich habe eine Backup Datei aus einer Datenbank erstellt. So sieht ein Beispielbackup aus, das ich gerade gezogen habe:
Code:
-- Host: localhost
-- Erstellungszeit: 27. March 2006 um 16:06
-- PHP-Version: 5.1.1
--
-- Datenbank: `__tables`
--

-- --------------------------------------------------------

TRUNCATE TABLE `domain_menuepunkte`;

--
-- Daten für Tabelle `domain_menuepunkte`
--

INSERT INTO `domain_menuepunkte` (ID, menuepunkt, kategorie) VALUES ('3', 'Lackierung', '4');

INSERT INTO `domain_menuepunkte` (ID, menuepunkt, kategorie) VALUES ('2', 'Unfallinstandsetzung', '4');

INSERT INTO `domain_menuepunkte` (ID, menuepunkt, kategorie) VALUES ('4', 'Auto', '-1');

INSERT INTO `domain_menuepunkte` (ID, menuepunkt, kategorie) VALUES ('5', 'Busse', '-1');

INSERT INTO `domain_menuepunkte` (ID, menuepunkt, kategorie) VALUES ('6', 'Werbeplakatierung', '5');

-- Host: localhost
-- Erstellungszeit: 27. March 2006 um 16:06
-- PHP-Version: 5.1.1
--
-- Datenbank: `__tables`
--

-- --------------------------------------------------------

TRUNCATE TABLE `domain_menuepunkte_inhalt`;

--
-- Daten für Tabelle `domain_menuepunkte_inhalt`
--

INSERT INTO `domain_menuepunkte_inhalt` (ID, menuepunkt_ID, content) VALUES ('1', '2', 'Inhalt zum Men&uuml;punkt <strong>Unfallinstandsetzung<br /><br /></strong>hier noch zus&auml;tzliche infos<br /><br /><br /><br />MillZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZalized');

INSERT INTO `domain_menuepunkte_inhalt` (ID, menuepunkt_ID, content) VALUES ('2', '3', '????????|Inhalt zuB <font size="4">Men&uuml;</font>pu<img src="/www.frank-domain.de/fckeditor/editor/images/smiley/msn/sad_smile.gif" alt="" />nkt<span class="Title"> <strong>Lacki<em><u>erun</u></em>g</strong></span>');

INSERT INTO `domain_menuepunkte_inhalt` (ID, menuepunkt_ID, content) VALUES ('3', '4', '<blockquote>In<sup>hal<font face="Comic Sans MS">t <span style="font-style: italic; font-weight: bold;">der <u><strong>KATEGO</strong></u>RIE </span>Au</font>to</sup></blockquote>');

INSERT INTO `domain_menuepunkte_inhalt` (ID, menuepunkt_ID, content) VALUES ('4', '5', 'Inhalt der <u>KATEGORIE</u> Busse');

INSERT INTO `domain_menuepunkte_inhalt` (ID, menuepunkt_ID, content) VALUES ('5', '6', '<table width=\"80%\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" align=\"left\">
    <tbody>
        <tr>
            <td>
            <h3>Werbeplakatierung</h3>
            <p>
            <table width=\"150\" cellspacing=\"0\" cellpadding=\"0\" border=\"1\" style=\"float: right;\">
                <tbody>
                    <tr>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#33ff66\"><strong>Leistungen</strong></td>
                    </tr>
                    <tr>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;Preis</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">Menge <br /></td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">Leistung <br /></td>
                    </tr>
                    <tr>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;100</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;20</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;Fotos</td>
                    </tr>
                    <tr>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;150</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;35</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;Designvorlagen</td>
                    </tr>
                    <tr>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;100</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">&nbsp;5</td>
                        <td width=\"1\" height=\"1\" bgcolor=\"#ff0066\" align=\"center\" colspan=\"3\" bordercolor=\"#cccc33\">Skriptklassen <br /></td>
                    </tr>
                </tbody>
            </table>
            Wir bieten auch die Beschriftung ihrer Wagen und Busse an.</p>
            <p>Nach Unf&auml;llen, steth es aus&szlig;er frage das wir bla und suelz u nd asdf <br /></p>
            <p>a</p>
            <p>sdfa</p>
            <p>dsf</p>
            <br />
            <p>&nbsp;</p>
            <p>asf</p>
            <p><br /></p>
            </td>
        </tr>
    </tbody>
</table>');

So weit so gut. Nun will ich das wieder einlesen. Hochladen klappt und auslesen der Datei auch (zeilenweise).
Nun dachte ich mir zu erst, ich könnte ja einfach den gesamten Inhalt nehmen und den als sqlquery versenden.

PHP:
mysql_query($der_string_oben_drueber);

Aber nichts da, geht nicht. Mysql meldet folgenden Fehler:
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; -- -- Daten für Tabelle `domain_menuepunkte` -- INSERT INTO `domain_menu' at line 10

Nun dachte ich mir, lese ich das ganze doch einfach Zeilen weise aus und schicke jeden query einzeln, sofern die gerade betrachtete Zeile mit "INSERT" oder "TRUNCATE" anfängt. Das hat auch schoen funktioniert. Aber eben beim Testen kam ich nun auch dazu, Umbrüche "\n" in der Datenbank zu speichern.
Damit funktioniert das zeilenweise Einlesen auch nicht mehr.

Wiekann ich nun noch angehen? könnt ihr mir helfen?
Wäre es vielleicht eine idee, einfah alle \n aus dem String zu entfernen?
Oder vielleicht gibt es ja eine Moeglichkeit, die Backupdatei anders zu strukturieren, so das ich alles mit einmal als query senden kann? Warum aber meckert der Sql-Parser, bei "--", das ist doch ein Kommentar ein SQL?

MfG
Danke für eure Anteilname :)
 
Zuletzt bearbeitet:
Wie hast du denn das Backup der Datenbank generiert? Gewöhnlich gibt es auch eine Gegenfunktion dazu.
 
selber geschrieben, mit Hilfe dieses Tutorials.
Hier der Code

PHP:
/**
                  *  Die Funktion getBackup bekommt ein Array von Tabellennamen
                  *  uebergben und gibt einen Backup String zurueck
                  */
                  function getBackup($arr, &$sql_statement){
                         
                     /**
                     * prüft ob die Tabellen existieren, die mittelks
                     * Array uebergeben werden 
                     */
                     $tabellen = mysql_list_tables($this->actual_DB); 
                   $tabellen_zahl = mysql_num_rows($tabellen);
                    
                   foreach ($arr as $tbl){
                       
                       unset($res);
                       
                       for ($t = 0; $t < $tabellen_zahl; $t++){
                           if (mysql_tablename($tabellen, $t) == $tbl){
                               $res = '1';
                           }// end if
                       }// end for
                       
                       if (empty($res)){
                           if(true === $this->ERROR_REPORTING)
                               echo "Die Tabelle '<b>".$tbl."</b>' ist in der Datenbank nicht vorhanden.";
                           return;
                       }// end if
                   }// end foreach
                     ##### Test ende
                     
                     
                     /**
                     * auslesen der einzelnen Tabellen und speichern der
                     * SQL Befehle in einem String
                     */
                     foreach($arr as $tbl){
                         
                       /*--- SQL Befehle ausführen ---*/
                       $sql = "SELECT * FROM $tbl";
                       $query = mysql_query($sql);
                       $feld_anzahl = mysql_num_fields($query);
                        
                       /*--- Ergebnisse der Mysql Abfrage ausgeben und in Textdateispeichern ---*/
                       $sql_statement .= "-- Host: ".$_SERVER['HTTP_HOST'].
                                         "\n-- Erstellungszeit: ".date("d. F Y u\m H:i").
                                         "\n-- PHP-Version: ".phpversion().
                                         "\n--\n-- Datenbank: `".$this->actual_DB.
                                         "`\n--\n\n-- --------------------------------------------------------\n\n";
                       $sql_statement .= "TRUNCATE TABLE `".$tbl.
                                         "`;\n\n--\n-- Daten für Tabelle `".$tbl."`\n--\n\n";
                        
                       while($ds = mysql_fetch_object($query)){
                           
                            $sql_statement .= "INSERT INTO `".$tbl."` (";
                        
                            for ($i = 0; $i < $feld_anzahl; $i++){
                                if ($i == $feld_anzahl-1){
                                    $sql_statement .= mysql_field_name($query, $i);
                                } else {
                                    $sql_statement .= mysql_field_name($query, $i).', ';
                                }//end if
                            }// end for i
                        
                            $sql_statement .= ") VALUES (";
                        
                            for ($i = 0; $i < $feld_anzahl; $i++){
                                $name = mysql_field_name($query, $i);
                                if (empty($ds->$name)){
                                    $ds->$name = "NULL";
                                }// end if
                       
                                if ($i == $feld_anzahl-1){
                                    $sql_statement .= "'".$ds->$name."'";
                                } else {
                                    $sql_statement .= "'".$ds->$name."', ";
                                }// end if
                            }// end for i
                        
                            $sql_statement .= ");\n\n";
                       }// end while
                     }// end foreach                                         
                  }// end getBackup
Bemerkung: dies is eine FUnktion meiner sql-Klasse

Die Gegenfunktion will ich gerade schreiben ;)
 
Mh, das bringt mich nich so recht voran.

Mir fiel eben noch eine Moeglichkeit ein.
Wäre es vielleicht praktisch, wenn ich das ganze in eine XML datei lese, die ungefähr folgenden aufbau hat:
XML:
<xml version ="backup">
  <DB-tabelle name="domain_menuepunkte">
    <spalten>
      <column>ID</column>
      <column>menuepunkt</column>
    </spalten>

    <inhalte>
      <value>1</value>
      <value>Menuepunkt1</value>
    </inhalte>
  </DB-tabelle>
</xml>

Dies ließe sich doch mit PHP vergleichsweise einfach auslesen und vergleichsweise einfach in ein SQL STatement bastelen.
Könnten Probleme auftreten, wenn zwischen den Tags <value>.....</value> html tags stehen? Eigentlcih doch nicht, denn es gibt ja kein HTML Tag <value>....?
 
Zuletzt bearbeitet von einem Moderator:
Das Ganze mit XML auszuzeichen, ist zwar möglich, wäre aber sicherlich ineffizient, da es viel Speicherplatz einnimmt. Enthaltener HTML-Code müsste natürlich entsprechend kodiert werden, damit es richtig übernommen wird. Denn esgibt zwar kein HTML-Element namens „value“, doch der Inhalt würde nicht-kodiert auch als XML interpretiert – bei nicht-wohlgeformter Syntax würde es sogar eine Fehlermeldung geben.
 
Arg, stimmt.

Hast du, Gumbo, oder sonst wer, noch eine Möglichkeit, wie ich das ganze handlen könnte? am liebsten wär mir natürlich, einfach das vorhande Skript n bissl zu ändern.
Sprich irgendwie, auf das zeilenweise einlese fixen, so das alles zwischen einem
"INSERT" und einem "');" als eine Zeile erkannt wird, wobei das auch nicht ganz sicher ist, denn es kann ja vorkommen, das irgendwie in dem HTML Dokument auch ein "');" vorkommt, obschon das sicherlich durch ein vorstehenden slash entwertet wird.

Wäre es also sinnvoll wie folgt vorzugehen:
Prüfe ob eine Zeile mit "INSERT" anfängt.

Wenn ja, prüfe ob sie auf "');" endet!
Wenn ja, führe mysql_query() aus.
Wenn nicht, lese nächste zeile und füge dem String hinzu. gehe wieder zu zeile


Sehr vereinfacht jetzt.


Anmerkung:

Die Effizienz und der Speicherplatz für etwaige Backup Skripte ist irrelevant, da der Administrator eher selten Backups ziehen wird und Speicherplatz heute nicht mehr teuer ist. Ihm ist egal, ob die Backup datei 10kb umfasst oder doch 1024kb.
 
Ich habs.
Es geht.

Ich habe es gemacht, wie beschrieben.
Da ich die Backup Datei selbst erstelle, zerlege ich sie. Ich lese alle einzelnen SQL commands aus!
 
Zurück