Scripte

PHP Script: MySQLDBExport-2.0.class.php

Nach obenNach unten

Zurück zur Übersicht - Datei downloaden

  1. <?php
  2.  
  3. //         **********************************************
  4. //         ***      MySQLDBExport.class.php v2.0      ***
  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->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.   Changelog
  50.   ==============
  51.   Von Version 1.0 auf Version 2.0 wurden folgende Änderungen vorgenommen:
  52.   - Das Script wurde zu einer Klasse umgeschrieben (vielen Dank dafür an
  53.     Jeena Paradies <http://jeenaparadies.net>), deshalb ist Version 2.0 auch nicht
  54.     zu Version 1.0 kompatibel!!
  55.   - Tabellen und Spaltennamen werden nun in Backticks ausgegeben, somit werden
  56.     auch Tabellen mit Leerzeichen im Namen unterstützt
  57.   - Code Cleaning
  58. */
  59.  
  60. class MySQLDBExport {
  61.  
  62.   var $con     = false;
  63.   var $db      = "";
  64.   var $newline = "\n";
  65.  
  66.   // -----------------------------------------------------------------------
  67.   function MySQLDBExport($host = NULL, $user = NULL, $pass = NULL) {
  68.     if($host != NULL AND $user != NULL) {
  69.       $con = mysql_connect($host, $user, $pass) OR die("Fehler beim Erstellen der Verbdingung: "
  70.            . mysql_error());
  71.       $this->con = $con;
  72.     }
  73.   }
  74.  
  75.   // -----------------------------------------------------------------------
  76.   function set_db($db) {
  77.     mysql_select_db($db) OR die("Fehler beim Auswählen der Datenbank: " . mysql_error());
  78.     $this->db = $db;
  79.   }
  80.  
  81.   // -----------------------------------------------------------------------
  82.   function get_tables() {
  83.     // Liste über alle existierenden Tabellen in der Datenbank besorgen
  84.     $result = mysql_query('SHOW TABLES FROM `' . $this->db . '`;') OR die(mysql_error());
  85.     // Array für Liste initialisieren
  86.     $tables = array();
  87.     // MySQL Ergebnisliste durchgehen und jede Tabelle in $tables hinzufügen
  88.     while (list($current) = mysql_fetch_row($result)) {
  89.       $tables[] = $current;
  90.     }
  91.     // Und Tabellenarray zurückgeben
  92.     return $tables;
  93.   }
  94.  
  95.   // -----------------------------------------------------------------------
  96.   function export_table_structure($table, $drop_if_exists = true) {
  97.     // Ausgabestring initialisieren
  98.     $sqlstring = "";
  99.     // Wenn DROP TABLE mit ausgegeben werden soll, dieses in den
  100.     // Ausgabestring schreiben
  101.     if($drop_if_exists)
  102.     {
  103.       $sqlstring .= "DROP TABLE IF EXISTS `$table`;" . $this->newline;
  104.     }
  105.     // Die CREATE TABLE Syntax per SQL Befehl besorgen oder Fehler ausgeben
  106.     $return = mysql_query("SHOW CREATE TABLE `$table`") OR
  107.                 die("Fehler beim Exportieren der Tabellenstruktur von $table: "
  108.                     . mysql_error()
  109.                    );
  110.     // Auslesen, ...
  111.     $data = mysql_fetch_assoc($return);
  112.     // ...in Ausgabestring schreiben ...
  113.     $sqlstring .= str_replace("\n", $this->newline, $data['Create Table']) . ";"
  114.                .  $this->newline
  115.                .  $this->newline;
  116.     // ...und diesen zurück geben
  117.     return $sqlstring;
  118.   }
  119.  
  120.   // -----------------------------------------------------------------------
  121.   function export_table_data($table, $leave_out_fields = false) {
  122.     // Alle Felder aus der Tabelle auslesen, bei Fehler abbrechen
  123.     $sql = "SELECT * FROM `" . $table . "`";
  124.     $return = mysql_query($sql) OR die(mysql_error());
  125.     // Ausgabestring initialisieren
  126.     $sqlstring = "";
  127.     // Alle Ergebniszeilen abarbeiten...
  128.     while($data = mysql_fetch_assoc($return))
  129.     {
  130.       // Arrays zum Sammeln der Key und der Value Werte initialisieren
  131.       $keys = array();
  132.       $values = array();
  133.       foreach($data as $key => $value) {
  134.         // Wenn dieses Feld ausgelassen werden soll, fahre mit
  135.         // nächster Schleife fort
  136.         if(is_array($leave_out_fields) AND in_array($key, $leave_out_fields)) {
  137.           continue;
  138.         }
  139.         // Sonst füge den aktuellen Key in das "Keysammelarray" hinzu
  140.         $keys[] = "`" . $key . "`";
  141.         // Wenn das Value NULL ist, in den String NULL umwandeln
  142.         if($value === NULL) {
  143.           $value = "NULL";
  144.         }
  145.         // Wenn das Value leer oder False ist, ein "" als Value nehmen
  146.         elseif($value === "" OR $value === false) {
  147.           $value = '""';
  148.         }
  149.         // Wenn das Value nicht numerisch ist, es mit mysql_real_escape_string()
  150.         // escapen und zwischen " setzen
  151.         elseif(!is_numeric($value)) {
  152.           $value = mysql_real_escape_string($value);
  153.           $value = "\"$value\"";
  154.         }
  155.         // In allen anderen Fällen ist das Value numerisch, kann belassen
  156.         // werden wie es ist und direkt in das "Valuesammelarray" hinzugefügt
  157.         // werden
  158.         $values[] = $value;
  159.       }
  160.       // Aus den Sammelarrays jetzt einen INSERT INTO SQL-Befehl erstellen und diesen
  161.       // an die Ausgabe anhängen
  162.       $sqlstring .= "INSERT INTO `$table` ( "
  163.                  .  implode(", ",$keys)
  164.                  .    " ){$this->newline}\tVALUES ( "
  165.                  .  implode(", ",$values)
  166.                  .    " );" . $this->newline;
  167.     }
  168.     // Ausgabestring zurückliefern
  169.     return $sqlstring;
  170.   }
  171.  
  172.   // -----------------------------------------------------------------------
  173.   function make_dump($tables_input = NULL)
  174.   {
  175.     // Ausgabestring für den Datenbank Dump initialisieren mit einer ersten Kommentarzeile
  176.     $exportstring = "-- ------------------------------------------" . $this->newline;
  177.     // Array für alle zu exportierenden Tabellen initialisieren
  178.     // Jeder Wert in diesem Array wird später als Tabellennamen aufgefasst und es wird
  179.     // versucht einen MySQL DUMP dieser Tabelle zu erstellen
  180.     $tables = array();
  181.     // Wenn für $tables_input ein Array übergeben wurde die Kopfzeile für einen indivi-
  182.     // duellen Datenbankexport erzeugen und alle Einträge aus dem Array in das Tabellen-
  183.     // array kopieren, sodass nur die im Array übergebenen Tabellen exportiert werden
  184.     if(is_array($tables_input))
  185.     {
  186.       $tables = $tables_input;
  187.       $exportstring .= "-- INDIVIDUAL DATABASE EXPORT              --" . $this->newline;
  188.     }
  189.     // Ansonsten, wenn $tables_input ein einfacher String ist, diesen als eine Tabelle
  190.     // auffassen und nur diese eine Tabelle exportieren, als Single Database Export
  191.     elseif(!is_array($tables_input) AND $tables_input != NULL)
  192.     {
  193.       $tables[0] = $tables_input;
  194.       $exportstring .= "-- SINGLE DATABASE EXPORT                  --" . $this->newline;
  195.     }
  196.     // Wurde der Parameter $tables_input gar nicht mit übergeben oder ist dieser False, so
  197.     // wird per $this->get_tables() herausgefunden welche Tabellen alle existieren und es werden
  198.     // alle Tabellen exportiert => Full Database Export
  199.     else
  200.     {
  201.       $tables = $this->get_tables();
  202.       $exportstring .= "-- FULL DATABASE EXPORT                    --".$this->newline;
  203.     }
  204.     // In den Ausgabestring die Kopfzeilen schreiben, welche den Namen der Datenbank in
  205.     // der die Tabellen liegen, das Datum zu dem der Dump erzeugt wurde sowie den Typ des
  206.     // Exports (s.o.) enthält
  207.     $exportstring .= "-- ------------------------------------------" . $this->newline
  208.                   .  "-- Database: " . $this->db.str_repeat(" ",30 - strlen($this->db)) . "--"
  209.                                                                      . $this->newline
  210.                   .  "-- Build: " . date("d.m.Y, H:i")."                --" . $this->newline
  211.                   .  "-- Script by Dennis Riehle                 --" . $this->newline
  212.                   .  "-- http://tutorial.riehle-web.com/scripts/ --" . $this->newline
  213.                   .  "-- ------------------------------------------" . $this->newline
  214.                                                                      . $this->newline;
  215.     // Gehe alle Tabellen in $tables durch und exportiere nacheinander von jeder Tabelle
  216.     // die Struktur, sowie die Daten.
  217.     foreach($tables as $table)
  218.     {
  219.       $exportstring .= "-- Table: $table" . $this->newline
  220.                     .  "-- ------------------------------------------" . $this->newline
  221.                     .  $this->export_table_structure($table, true)
  222.                     .  $this->export_table_data($table, false)
  223.                     .  $this->newline;
  224.     }
  225.     // Füge dem Exportstring noch ein Ende Kennzeichen hinzu...
  226.     $exportstring .= "-- ------------------------------------------" . $this->newline
  227.                   .  "-- Export End                              --" . $this->newline
  228.                   .  "-- ------------------------------------------" . $this->newline;
  229.     // ...und liefere den kompletten String zurück.
  230.     return $exportstring;
  231.   }
  232. }
  233. // -----------------------------------------------------------------------
  234. /*
  235.     ENDE
  236. */
  237.  
  238. ?>
  239.  

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.