Scripte

PHP Script: MySQLDBExport-2.0.2.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.1 auf Version 2.0.2 wurden folgende Änderungen vorgenommen:
  57.   - in Zeile 272 und 273 (bzw. 284 und 285 in Version 2.0.1) fehlte ein abschließendes
  58.     Semikolon (Syntaxfehler)
  59.   - in get_tables() trat eine Verwechslung von Variablen auf
  60. */
  61.  
  62. class MySQLDBExport {
  63.  
  64.   var $con     = false;
  65.   var $db      = "";
  66.   var $newline = "\n";
  67.   var $error   = "";
  68.  
  69.   // -----------------------------------------------------------------------
  70.   function MySQLDBExport($host = NULL, $user = NULL, $pass = NULL) {
  71.     // Initialisierung - sofern gewünscht, MySQL Verbindung aufbauen
  72.     if($host != NULL AND $user != NULL) {
  73.       // Verbindung herstellen
  74.       $con = @mysql_connect($host, $user, $pass);
  75.       // Wenn fehlgeschlagen, Error melden und abbrechen
  76.       if(!$con) {
  77.         $this->error = "Fehler beim Herstellen der MySQL Verbindung - " . mysql_error();
  78.         return false;
  79.       }
  80.       // Sonst die Verbindung in $con speichern
  81.       $this->con = $con;
  82.       return true;
  83.     }
  84.   }
  85.  
  86.   // -----------------------------------------------------------------------
  87.   function get_error() {
  88.     // Ausgabe der letzten Error-Meldung
  89.     return $this->error;
  90.   }
  91.  
  92.   // -----------------------------------------------------------------------
  93.   function set_newline($newline) {
  94.     // Setzen von $newline
  95.     $this->newline = $newline;
  96.     return true;
  97.   }
  98.  
  99.   // -----------------------------------------------------------------------
  100.   function set_db($db) {
  101.     // Wenn vorher bereits ein Fehler aufgetreten ist, abbrechen
  102.     if(!empty($this->error)) {
  103.       return false;
  104.     }
  105.     // Sonst versuchen, die MySQL Datenbank auszuwählen
  106.     $try = @mysql_select_db($db);
  107.     // Im Fehlerfall einen Error melden und abbrechen
  108.     if(!$try) {
  109.       $this->error = mysql_error();
  110.       return false;
  111.     }
  112.     // Sonst den Datenbanknamen abspeichern in $db
  113.     $this->db = $db;
  114.     return true;
  115.   }
  116.  
  117.   // -----------------------------------------------------------------------
  118.   function escape_table_name($table) {
  119.     // Escapen von Tabellen oder Datenbanknamen gemäß
  120.     // <http://dev.mysql.com/doc/refman/5.0/en/legal-names.html>
  121.     $table = str_replace("´", "´´", $table);
  122.     return $table;
  123.   }
  124.  
  125.   // -----------------------------------------------------------------------
  126.   function get_tables() {
  127.     // Liste über alle existierenden Tabellen in der Datenbank besorgen
  128.     $result = mysql_query('SHOW TABLES FROM `' . $this->escape_table_name($this->db) . '`;');
  129.     if(!$result) {
  130.       $this->error = mysql_error();
  131.       return false;
  132.     }
  133.     // Array für Liste initialisieren
  134.     $tables = array();
  135.     // MySQL Ergebnisliste durchgehen und jede Tabelle in $tables hinzufügen
  136.     while (list($current) = mysql_fetch_row($result)) {
  137.       $tables[] = $current;
  138.     }
  139.     // Und Tabellenarray zurückgeben
  140.     return $tables;
  141.   }
  142.  
  143.   // -----------------------------------------------------------------------
  144.   function export_table_structure($table, $drop_if_exists = true) {
  145.     // Ausgabestring initialisieren
  146.     $sqlstring = "";
  147.     // Wenn DROP TABLE mit ausgegeben werden soll, dieses in den
  148.     // Ausgabestring schreiben
  149.     if($drop_if_exists) {
  150.       $sqlstring .= "DROP TABLE IF EXISTS `" . $this->escape_table_name($table)
  151.                  .  "`;" . $this->newline;
  152.     }
  153.     // Die CREATE TABLE Syntax per SQL Befehl besorgen oder Fehler ausgeben
  154.     $return = mysql_query("SHOW CREATE TABLE `" . $this->escape_table_name($table) . "`");
  155.     if(!$return) {
  156.       $this->error = mysql_error();
  157.       return false;
  158.     }
  159.     // Auslesen, ...
  160.     $data = mysql_fetch_assoc($return);
  161.     // ...in Ausgabestring schreiben ...
  162.     $sqlstring .= str_replace("\n", $this->newline, $data['Create Table']) . ";"
  163.                .  $this->newline
  164.                .  $this->newline;
  165.     // ...und diesen zurück geben
  166.     return $sqlstring;
  167.   }
  168.  
  169.   // -----------------------------------------------------------------------
  170.   function export_table_data($table, $leave_out_fields = false) {
  171.     // Alle Felder aus der Tabelle auslesen, bei Fehler abbrechen
  172.     $sql = "SELECT * FROM `" . $this->escape_table_name($table) . "`";
  173.     $return = mysql_query($sql);
  174.     if(!$return) {
  175.       $this->error = mysql_error();
  176.       return false;
  177.     }
  178.     // Ausgabestring initialisieren
  179.     $sqlstring = "";
  180.     // Alle Ergebniszeilen abarbeiten...
  181.     while($data = mysql_fetch_assoc($return))
  182.     {
  183.       // Arrays zum Sammeln der Key und der Value Werte initialisieren
  184.       $keys = array();
  185.       $values = array();
  186.       foreach($data as $key => $value) {
  187.         // Wenn dieses Feld ausgelassen werden soll, fahre mit
  188.         // nächster Schleife fort
  189.         if(is_array($leave_out_fields) AND in_array($key, $leave_out_fields)) {
  190.           continue;
  191.         }
  192.         // Sonst füge den aktuellen Key in das "Keysammelarray" hinzu
  193.         $keys[] = "`" . $this->escape_table_name($key) . "`";
  194.         // Wenn das Value NULL ist, in den String NULL umwandeln
  195.         if($value === NULL) {
  196.           $value = "NULL";
  197.         }
  198.         // Wenn das Value leer oder False ist, ein "" als Value nehmen
  199.         elseif($value === "" OR $value === false) {
  200.           $value = '""';
  201.         }
  202.         // Wenn das Value nicht numerisch ist, es mit mysql_real_escape_string()
  203.         // escapen und zwischen " setzen
  204.         elseif(!is_numeric($value)) {
  205.           $value = mysql_real_escape_string($value);
  206.           $value = "\"$value\"";
  207.         }
  208.         // In allen anderen Fällen ist das Value numerisch, kann belassen
  209.         // werden wie es ist und direkt in das "Valuesammelarray" hinzugefügt
  210.         // werden
  211.         $values[] = $value;
  212.       }
  213.       // Aus den Sammelarrays jetzt einen INSERT INTO SQL-Befehl erstellen und diesen
  214.       // an die Ausgabe anhängen
  215.       $sqlstring .= "INSERT INTO `" . $this->escape_table_name($table) . "` ( "
  216.                  .  implode(", ",$keys)
  217.                  .    " ){$this->newline}\tVALUES ( "
  218.                  .  implode(", ",$values)
  219.                  .    " );" . $this->newline;
  220.     }
  221.     // Ausgabestring zurückliefern
  222.     return $sqlstring;
  223.   }
  224.  
  225.   // -----------------------------------------------------------------------
  226.   function make_dump($tables_input = NULL, $drop_if_exists = false, $leave_out_fields = false ) {
  227.     // Ausgabestring für den Datenbank Dump initialisieren mit einer ersten Kommentarzeile
  228.     $exportstring = "-- ------------------------------------------" . $this->newline;
  229.     // Array für alle zu exportierenden Tabellen initialisieren
  230.     // Jeder Wert in diesem Array wird später als Tabellennamen aufgefasst und es wird
  231.     // versucht einen MySQL DUMP dieser Tabelle zu erstellen
  232.     $tables = array();
  233.     // Wenn für $tables_input ein Array übergeben wurde die Kopfzeile für einen indivi-
  234.     // duellen Datenbankexport erzeugen und alle Einträge aus dem Array in das Tabellen-
  235.     // array kopieren, sodass nur die im Array übergebenen Tabellen exportiert werden
  236.     if(is_array($tables_input)) {
  237.       $tables = $tables_input;
  238.       $exportstring .= "-- INDIVIDUAL DATABASE EXPORT              --" . $this->newline;
  239.     }
  240.     // Ansonsten, wenn $tables_input ein einfacher String ist, diesen als eine Tabelle
  241.     // auffassen und nur diese eine Tabelle exportieren, als Single Database Export
  242.     elseif(!is_array($tables_input) AND $tables_input != NULL) {
  243.       $tables[0] = $tables_input;
  244.       $exportstring .= "-- SINGLE DATABASE EXPORT                  --" . $this->newline;
  245.     }
  246.     // Wurde der Parameter $tables_input gar nicht mit übergeben oder ist dieser False, so
  247.     // wird per $this->get_tables() herausgefunden welche Tabellen alle existieren und es werden
  248.     // alle Tabellen exportiert => Full Database Export
  249.     else {
  250.       $tables = $this->get_tables();
  251.       // Wenn get_tables() fehlschlägt, abbrechen
  252.       if($tables === false) return false;
  253.       $exportstring .= "-- FULL DATABASE EXPORT                    --".$this->newline;
  254.     }
  255.     // In den Ausgabestring die Kopfzeilen schreiben, welche den Namen der Datenbank in
  256.     // der die Tabellen liegen, das Datum zu dem der Dump erzeugt wurde sowie den Typ des
  257.     // Exports (s.o.) enthält
  258.     $exportstring .= "-- ------------------------------------------" . $this->newline
  259.                   .  "-- Database: " . $this->db.str_repeat(" ",30 - strlen($this->db)) . "--"
  260.                                                                      . $this->newline
  261.                   .  "-- Build: " . date("d.m.Y, H:i")."                --" . $this->newline
  262.                   .  "-- Script by Dennis Riehle                 --" . $this->newline
  263.                   .  "-- http://tutorial.riehle-web.com/scripts/ --" . $this->newline
  264.                   .  "-- ------------------------------------------" . $this->newline
  265.                                                                      . $this->newline;
  266.     // Gehe alle Tabellen in $tables durch und exportiere nacheinander von jeder Tabelle
  267.     // die Struktur, sowie die Daten.
  268.     foreach($tables as $table) {
  269.       $structure = $this->export_table_structure($table, $drop_if_exists);
  270.       $data      = $this->export_table_data($table, $leave_out_fields);
  271.       // Wenn export_table_structure() oder export_table_data() fehlschlägt, abbrechen
  272.       if($structure === false OR $data === false) return false;
  273.       $exportstring .= "-- Table: $table" . $this->newline
  274.                     .  "-- ------------------------------------------" . $this->newline
  275.                     .  $structure
  276.                     .  $data
  277.                     .  $this->newline;
  278.     }
  279.     // Füge dem Exportstring noch ein Ende Kennzeichen hinzu...
  280.     $exportstring .= "-- ------------------------------------------" . $this->newline
  281.                   .  "-- Export End                              --" . $this->newline
  282.                   .  "-- ------------------------------------------" . $this->newline;
  283.     // ...und liefere den kompletten String zurück.
  284.     return $exportstring;
  285.   }
  286. }
  287. // -----------------------------------------------------------------------
  288. /*
  289.     ENDE
  290. */
  291.  
  292. ?>
  293.  

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.