MySQL Datenbank exportieren wie in PHPmyAdmin (PHP)

Einleitung

Oft möchte man eine -Datenbank exportieren - beispielsweise als Backup, sodass man diese später wieder (z.B. per mysql_query()) importieren kann. Diese Funktion exportiert komplette Tabellen mit Struktur und Inhalt.

Hinweis / WIchtig

aus dem Jahr 2005 (!). Aufgrund großer Nachfrage habe ihn wieder online gestellt.
Bitte beachte das es inzwischen evt. einfacher ist eine Datenbank zu exportieren bzw. sogar etwas am Script falsch ist.
Prüfe deswegen - und zwar bevor du das Script richig einsetzt - ob noch alles funktioniert und auch das Importieren klappt.

Die Funktion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
// (c) 2005 by Franky
// http://FrankyOnline.de/
 
function parsefield($field, $typ){
  if($typ == 'integer') return $field;
  else{
    $field = addslashes($field);
    $field = str_replace("\t", "\\t", $field);
    $field = str_replace("\r", "\\r", $field);
    $field = str_replace("\n", "\\n", $field);
    return '\''.$field.'\'';
  }
}
 
function mysql_export_table($table, $connection=''){
  // Struktur
  $dump = "CREATE TABLE `".$table."` (\n";
 
  $types = array();
  $result = mysql_query('DESCRIBE '.$table, $connection);
  $count = mysql_num_rows($result);
 
  $i = 0;
  while($row = mysql_fetch_array($result)){
    $name = $row['Field'];
    $typ = ' '.$row['Type'];
 
    $fieldtypes[$name] = (!stristr($row['Type'], "ENUM") && ((stristr($row['Type'], "INT") || stristr($row['Type'], "FLOAT") || stristr($row['Type'], "DOUBLE") || stristr($row['Type'], "REAL") || stristr($row['Type'], "DECIMAL") || stristr($row['Type'], "NUMERIC") || stristr($row['Type'], "TIMESTAMP") || stristr($row['Type'], "YEAR"))) ? ("integer") : ("string"));
 
    if($row['Null'] == '') $null = ' NOT NULL';
    else $null = ' NULL';
 
    if($row['Default'] == '') $default = '';
    else $default = " DEFAULT '".$row['Default']."'";
 
    if($row['Extra'] == '') $extra = '';
    else $extra = ' '.$row['Extra'];
 
    $dump .= "  ".$name.$typ.$null.$default.$extra;
 
    $i++;
    if($i < $count) $dump .= ", \n";
  }
 
  $index = array();
  $result = mysql_query('SHOW KEYS FROM '.$table, $connection);
  while($row = mysql_fetch_array($result)){
    $keyname = $row['Key_name'];
    $comment = (isset($row['Comment'])) ? $row['Comment'] : '';
    $sub_part = (isset($row['Sub_part'])) ? $row['Sub_part'] : '';
 
    if($keyname != 'PRIMARY' && $row['Non_unique'] == 0) $keyname = 'UNIQUE|'.$keyname;
 
    if($comment == 'FULLTEXT') $keyname = 'FULLTEXT|'.$keyname;
 
    if(!isset($index[$keyname])) $index[$keyname] = array();
 
    if($sub_part > 1) $index[$keyname][] = $row['Column_name']."(".$sub_part.")";
    else $index[$keyname][] = $row['Column_name'];
  }
  mysql_free_result($result);
 
  foreach($index as $keyname => $columns){
    $dump .= ", \n";
    if($keyname == "PRIMARY") $dump .= "  PRIMARY KEY (";
    elseif(substr($keyname, 0, 6) == "UNIQUE") $dump .= "  UNIQUE ".substr($keyname, 7)." (";
    elseif(substr($keyname, 0, 8) == "FULLTEXT") $dump .= "  FULLTEXT ".substr($keyname, 9)." (";
    else $dump .= "  KEY ".$keyname." (";
 
    $dump .= implode($columns, ", ").')';
  }
 
  $dump .= "\n);\n\n";
 
 
 
  // Content
  $insert_tag = 0;
  $rowcount = 0;
  $result = mysql_query('SELECT * FROM '.$table, $connection);
  while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    $values = '';
    foreach($row as $key => $field)
      if($values != '') $values .= ','.parsefield($field, $fieldtypes[$key]);
      else $values = parsefield($field, $fieldtypes[$key]);
 
    if($insert_tag == 0){
      $dump .= 'INSERT INTO '.$table.' VALUES ('.$values.')';
      $insert_tag = 1;    
    }else $dump .= ',('.$values.')';
 
    if($insert_tag == 1 && $rowcount == 500){
      $dump .= ";\n";
      $insert_tag = 0;
      $rowcount = 0;
    }
 
    $rowcount++;
  }
  mysql_free_result($result);
 
  if($insert_tag == 1) $dump .= ";\n";
 
  return $dump;
}
?>

Beispiel

Diese Beispiel exportiert alle Tabellen (nacheinander in einer Schleife) einer Datenbank. Zuerst wird eine Verbindung zur Datenbank hergestellt (Parameter ändern!) und anschließend der Dump ausgegeben.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$mysqlconnect = mysql_connect('localhost', 'root', '');
$result = mysql_list_tables('datenbank', $mysqlconnect);
$num_tables = mysql_num_rows($result);
 
for($i=0;$i<$num_tables;$i++){
  $table = mysql_tablename($result, $i);
  echo mysql_export_table($table, $mysqlconnect);
}
 
mysql_free_result($result);
mysql_close($mysqlconnect);
?>

Eine Ausgabe könnte wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `counter` (
  `datum` date NOT NULL default '0000-00-00',
  `visitors` int(5) NOT NULL default '0',
  PRIMARY KEY  (`datum`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
INSERT INTO `counter` VALUES ('2005-09-03', 25);
INSERT INTO `counter` VALUES ('2005-09-04', 48);
INSERT INTO `counter` VALUES ('2005-09-05', 31);
# ...

Fragen oder Probleme? Einfach schnell einen Kommentar schreiben.

5 Reaktionen zu “MySQL Datenbank exportieren wie in PHPmyAdmin (PHP)”

Pingbacks

  1. Neue Codeschnipsel: MySQL Dump via PHP & Teamspeak2 installieren in Codeschnipsel | FrankyOnline.de

Kommentare

  1. Thomsen sagt:

    bei mir geht da nicht!!!!!

  2. Franky sagt:

    Warum geht das bei dir nicht? Einwenig detaillierter, bitte :-)

  3. Anja sagt:

    vielen lieben dank für dieses Script, das einzige womit ich noch schwierigkeiten habe sind die Umlaute, diese werden mir noch falsch übergeben, und beim importieren erhalte ich dann nur ? anstelle eines ü’s

    woran könnte das liegen?

  4. Anja sagt:

    ah hab den fehler finden können, ich muss das sql file dann als binary importieren

Kommentar schreiben

  1. (Pflicht)
  2. (Pflicht)
  3. (Pflicht)
  4. Senden als..
 

cforms contact form by delicious:days