Scripte

PHP Script: MySQLDBExport-2.0.1.class.php

Nach obenNach unten

Zurück zur Übersicht - Datei downloaden

  1. <?php
  2.  
  3. //         **********************************************
  4. //         ***     MySQLDBExport.class.php v2.0.1     ***
  5. //         **********************************************
  6.  
  7. // -----------------------------------------------------------------------
  8. /*
  9.   Copyright:
  10.   ==============
  11.   Dieses Script wurde ursprünglich von Dennis Riehle geschrieben - Sie dürfen
  12.   das Script frei verwenden, bearbeiten und weitergeben, solange dieser Copyright
  13.   Hinweis nicht entfernt wird.
  14.   Es erfolgt keinerlei Haftung für eventuell durch dieses Script entstandene
  15.   Schäden - die Benutzung erfolgt vollständig auf eigene Gefahr.
  16.   Beschreibung:
  17.   ==============
  18.   Mit dieser Klasse lässt sich ein Dump (Export) einer MySQL Datenbank erzeugen,
  19.   was z.B. für ein Backupsystem verwendet werden kann.
  20.   Benutzung:
  21.   ==============
  22.   a) Bei einer bereits vorhandenen MySQL Verbindung:
  23.      
  24.         $export = new MySQLDBExport();    // Instanz erzeugen
  25.         $export->set_db("Datenbank");     // Datenbank auswählen
  26.         $dump   = $export->make_dump();   // Dump erstellen
  27.        
  28.   b) Wenn erst noch eine Verbindung hergestellt werden muss:
  29.  
  30.         $export = new MySQLDBExport("Host", "User", "Passwort");
  31.                                           // Instanz erzeugen und gleichzeitig
  32.                                           // eine MySQL-Verbindung erstellen
  33.         $export->set_db("Datenbank");     // Datenbank auswählen
  34.         $dump   = $export->make_dump();   // Dump erstellen
  35.        
  36.   Weitere Optionen:
  37.   -----------------
  38.   Standardmäßig wird innerhalb des Dumps ein Unix Zeilenumbruch verwendet, möchte
  39.   man dies ändern, so ist vor dem Aufrufen von make_dump() folgendes zu setzen:
  40.     $export->set_newline("\r\n");
  41.  
  42.   MySQLDBExport erzeugt normalerweise immer einen Dump für alle sich innerhalb einer
  43.   Datenbank befindlichen Tabellen, möchte man nur eine einzelne oder nur bestimmte
  44.   Tabellen exportieren, so lässt sich make_dump() ein String oder ein Array der
  45.   zu exportierenden Tabellen übergeben:
  46.     $export->make_dump("Tabellenname");
  47.   Oder:
  48.     $export->make_dump(array("Tabelle1", "Tabelle2"));
  49.    
  50.   Error Handling - beim Auftreten eines Fehlers liefern die Funktionen false
  51.   zurück und schreiben eine Nachricht in die error Variable, die sich wie folgt
  52.   abfragen lässt:
  53.     echo $export->get_error();
  54.   Changelog
  55.   ==============
  56.   Von Version 2.0 auf Version 2.0.1 wurden folgende Änderungen vorgenommen:
  57.   - Wie von dedlfix (<http://forum.de.selfhtml.org/?t=125488&m=809046#nachricht>)
  58.     angemerkt ist es nicht schön, dass Script per die() sterben zu lassen,
  59.     aus diesem Grund wurde die error Variable eingeführt, sowie die Funktion
  60.     get_error() zum Abfragen selbiger
  61.   - Rein theoretisch wäre es bei einer schlechten Programmierung mit dieser
  62.     Klasse möglich gewesen, über den Tabellennamen SQL Injections einfließen zu
  63.     lassen (s.a. <http://forum.de.selfhtml.org/?t=125488&m=809778#nachricht>),
  64.     die neue Version behebt diese Probleme durch escapen des Backticks in
  65.     Tabellennamen mit der Funktion escape_table_name()
  66.   - Mit set_newline() ist eine Möglichkeit hinzugekommen, wie sich $newline
  67.     im Sinne von OOP setzen lässt
  68.   - Die Funktion make_dump() hat noch zwei weitere optionale Parameter die an
  69.     export_table_structure() und export_table_data() durchgeschleust werden,
  70.     dadurch sind diese Werte nicht mehr hartkodiert.
  71.   - Code Cleaning, Kommentierung
  72. */
  73.  
  74. class MySQLDBExport {
  75.  
  76.   var $con     = false;
  77.   var $db      = "";
  78.   var $newline = "\n";
  79.   var $error   = "";
  80.  
  81.   // -----------------------------------------------------------------------
  82.   function MySQLDBExport($host = NULL, $user = NULL, $pass = NULL) {
  83.     // Initialisierung - sofern gewünscht, MySQL Verbindung aufbauen
  84.     if($host != NULL AND $user != NULL) {
  85.       // Verbindung herstellen
  86.       $con = @mysql_connect($host, $user, $pass);
  87.       // Wenn fehlgeschlagen, Error melden und abbrechen
  88.       if(!$con) {
  89.         $this->error = "Fehler beim Herstellen der MySQL Verbindung - " . mysql_error();
  90.         return false;
  91.       }
  92.       // Sonst die Verbindung in $con speichern
  93.       $this->con = $con;
  94.       return true;
  95.     }
  96.   }
  97.  
  98.   // -----------------------------------------------------------------------
  99.   function get_error() {
  100.     // Ausgabe der letzten Error-Meldung
  101.     return $this->error;
  102.   }
  103.  
  104.   // -----------------------------------------------------------------------
  105.   function set_newline($newline) {
  106.     // Setzen von $newline
  107.     $this->newline = $newline;
  108.     return true;
  109.   }
  110.  
  111.   // -----------------------------------------------------------------------
  112.   function set_db($db) {
  113.     // Wenn vorher bereits ein Fehler aufgetreten ist, abbrechen
  114.     if(!empty($this->error)) {
  115.       return false;
  116.     }
  117.     // Sonst versuchen, die MySQL Datenbank auszuwählen
  118.     $try = @mysql_select_db($db);
  119.     // Im Fehlerfall einen Error melden und abbrechen
  120.     if(!$try) {
  121.       $this->error = mysql_error();
  122.       return false;
  123.     }
  124.     // Sonst den Datenbanknamen abspeichern in $db
  125.     $this->db = $db;
  126.     return true;
  127.   }
  128.  
  129.   // -----------------------------------------------------------------------
  130.   function escape_table_name($table) {
  131.     // Escapen von Tabellen oder Datenbanknamen gemäß
  132.     // <http://dev.mysql.com/doc/refman/5.0/en/legal-names.html>
  133.     $table = str_replace("´", "´´", $table);
  134.     return $table;
  135.   }
  136.  
  137.   // -----------------------------------------------------------------------
  138.   function get_tables() {
  139.     // Liste über alle existierenden Tabellen in der Datenbank besorgen
  140.     $return = mysql_query('SHOW TABLES FROM `' . $this->escape_table_name($this->db) . '`;');
  141.     if(!$return) {
  142.       $this->error = mysql_error();
  143.       return false;
  144.     }
  145.     // Array für Liste initialisieren
  146.     $tables = array();
  147.     // MySQL Ergebnisliste durchgehen und jede Tabelle in $tables hinzufügen
  148.     while (list($current) = mysql_fetch_row($result)) {
  149.       $tables[] = $current;
  150.     }
  151.     // Und Tabellenarray zurückgeben
  152.     return $tables;
  153.   }
  154.  
  155.   // -----------------------------------------------------------------------
  156.   function export_table_structure($table, $drop_if_exists = true) {
  157.     // Ausgabestring initialisieren
  158.     $sqlstring = "";
  159.     // Wenn DROP TABLE mit ausgegeben werden soll, dieses in den
  160.     // Ausgabestring schreiben
  161.     if($drop_if_exists) {
  162.       $sqlstring .= "DROP TABLE IF EXISTS `" . $this->escape_table_name($table)
  163.                  .  "`;" . $this->newline;
  164.     }
  165.     // Die CREATE TABLE Syntax per SQL Befehl besorgen oder Fehler ausgeben
  166.     $return = mysql_query("SHOW CREATE TABLE `" . $this->escape_table_name($table) . "`");
  167.     if(!$return) {
  168.       $this->error = mysql_error();
  169.       return false;
  170.     }
  171.     // Auslesen, ...
  172.     $data = mysql_fetch_assoc($return);
  173.     // ...in Ausgabestring schreiben ...
  174.     $sqlstring .= str_replace("\n", $this->newline, $data['Create Table']) . ";"
  175.                .  $this->newline
  176.                .  $this->newline;
  177.     // ...und diesen zurück geben
  178.     return $sqlstring;
  179.   }
  180.  
  181.   // -----------------------------------------------------------------------
  182.   function export_table_data($table, $leave_out_fields = false) {
  183.     // Alle Felder aus der Tabelle auslesen, bei Fehler abbrechen
  184.     $sql = "SELECT * FROM `" . $this->escape_table_name($table) . "`";
  185.     $return = mysql_query($sql);
  186.     if(!$return) {
  187.       $this->error = mysql_error();
  188.       return false;
  189.     }
  190.     // Ausgabestring initialisieren
  191.     $sqlstring = "";
  192.     // Alle Ergebniszeilen abarbeiten...
  193.     while($data = mysql_fetch_assoc($return))
  194.     {
  195.       // Arrays zum Sammeln der Key und der Value Werte initialisieren
  196.       $keys = array();
  197.       $values = array();
  198.       foreach($data as $key => $value) {
  199.         // Wenn dieses Feld ausgelassen werden soll, fahre mit
  200.         // nächster Schleife fort
  201.         if(is_array($leave_out_fields) AND in_array($key, $leave_out_fields)) {
  202.           continue;
  203.         }
  204.         // Sonst füge den aktuellen Key in das "Keysammelarray" hinzu
  205.         $keys[] = "`" . $this->escape_table_name($key) . "`";
  206.         // Wenn das Value NULL ist, in den String NULL umwandeln
  207.         if($value === NULL) {
  208.           $value = "NULL";
  209.         }
  210.         // Wenn das Value leer oder False ist, ein "" als Value nehmen
  211.         elseif($value === "" OR $value === false) {
  212.           $value = '""';
  213.         }
  214.         // Wenn das Value nicht numerisch ist, es mit mysql_real_escape_string()
  215.         // escapen und zwischen " setzen
  216.         elseif(!is_numeric($value)) {
  217.           $value = mysql_real_escape_string($value);
  218.           $value = "\"$value\"";
  219.         }
  220.         // In allen anderen Fällen ist das Value numerisch, kann belassen
  221.         // werden wie es ist und direkt in das "Valuesammelarray" hinzugefügt
  222.         // werden
  223.         $values[] = $value;
  224.       }
  225.       // Aus den Sammelarrays jetzt einen INSERT INTO SQL-Befehl erstellen und diesen
  226.       // an die Ausgabe anhängen
  227.       $sqlstring .= "INSERT INTO `" . $this->escape_table_name($table) . "` ( "
  228.                  .  implode(", ",$keys)
  229.                  .    " ){$this->newline}\tVALUES ( "
  230.                  .  implode(", ",$values)
  231.                  .    " );" . $this->newline;
  232.     }
  233.     // Ausgabestring zurückliefern
  234.     return $sqlstring;
  235.   }
  236.  
  237.   // -----------------------------------------------------------------------
  238.   function make_dump($tables_input = NULL, $drop_if_exists = false, $leave_out_fields = false ) {
  239.     // Ausgabestring für den Datenbank Dump initialisieren mit einer ersten Kommentarzeile
  240.     $exportstring = "-- ------------------------------------------" . $this->newline;
  241.     // Array für alle zu exportierenden Tabellen initialisieren
  242.     // Jeder Wert in diesem Array wird später als Tabellennamen aufgefasst und es wird
  243.     // versucht einen MySQL DUMP dieser Tabelle zu erstellen
  244.     $tables = array();
  245.     // Wenn für $tables_input ein Array übergeben wurde die Kopfzeile für einen indivi-
  246.     // duellen Datenbankexport erzeugen und alle Einträge aus dem Array in das Tabellen-
  247.     // array kopieren, sodass nur die im Array übergebenen Tabellen exportiert werden
  248.     if(is_array($tables_input)) {
  249.       $tables = $tables_input;
  250.       $exportstring .= "-- INDIVIDUAL DATABASE EXPORT              --" . $this->newline;
  251.     }
  252.     // Ansonsten, wenn $tables_input ein einfacher String ist, diesen als eine Tabelle
  253.     // auffassen und nur diese eine Tabelle exportieren, als Single Database Export
  254.     elseif(!is_array($tables_input) AND $tables_input != NULL) {
  255.       $tables[0] = $tables_input;
  256.       $exportstring .= "-- SINGLE DATABASE EXPORT                  --" . $this->newline;
  257.     }
  258.     // Wurde der Parameter $tables_input gar nicht mit übergeben oder ist dieser False, so
  259.     // wird per $this->get_tables() herausgefunden welche Tabellen alle existieren und es werden
  260.     // alle Tabellen exportiert => Full Database Export
  261.     else {
  262.       $tables = $this->get_tables();
  263.       // Wenn get_tables() fehlschlägt, abbrechen
  264.       if($tables === false) return false;
  265.       $exportstring .= "-- FULL DATABASE EXPORT                    --".$this->newline;
  266.     }
  267.     // In den Ausgabestring die Kopfzeilen schreiben, welche den Namen der Datenbank in
  268.     // der die Tabellen liegen, das Datum zu dem der Dump erzeugt wurde sowie den Typ des
  269.     // Exports (s.o.) enthält
  270.     $exportstring .= "-- ------------------------------------------" . $this->newline
  271.                   .  "-- Database: " . $this->db.str_repeat(" ",30 - strlen($this->db)) . "--"
  272.                                                                      . $this->newline
  273.                   .  "-- Build: " . date("d.m.Y, H:i")."                --" . $this->newline
  274.                   .  "-- Script by Dennis Riehle                 --" . $this->newline
  275.                   .  "-- http://tutorial.riehle-web.com/scripts/ --" . $this->newline
  276.                   .  "-- ------------------------------------------" . $this->newline
  277.                                                                      . $this->newline;
  278.     // Gehe alle Tabellen in $tables durch und exportiere nacheinander von jeder Tabelle
  279.     // die Struktur, sowie die Daten.
  280.     foreach($tables as $table) {
  281.       $structure = $this->export_table_structure($table, $drop_if_exists)
  282.       $data      = $this->export_table_data($table, $leave_out_fields)
  283.       // Wenn export_table_structure() oder export_table_data() fehlschlägt, abbrechen
  284.       if($structure === false OR $data === false) return false;
  285.       $exportstring .= "-- Table: $table" . $this->newline
  286.                     .  "-- ------------------------------------------" . $this->newline
  287.                     .  $structure
  288.                     .  $data
  289.                     .  $this->newline;
  290.     }
  291.     // Füge dem Exportstring noch ein Ende Kennzeichen hinzu...
  292.     $exportstring .= "-- ------------------------------------------" . $this->newline
  293.                   .  "-- Export End                              --" . $this->newline
  294.                   .  "-- ------------------------------------------" . $this->newline;
  295.     // ...und liefere den kompletten String zurück.
  296.     return $exportstring;
  297.   }
  298. }
  299. // -----------------------------------------------------------------------
  300. /*
  301.     ENDE
  302. */
  303.  
  304. ?>
  305.  

Zurück zur Übersicht - Datei downloaden

Nach obenNach unten

Valid XHTML 1.0! Valid CSS!

Letzte Änderungen: Sonntag, der 03. Februar 2008
© 2005, Dennis Riehle.