Skip to main content

データベース (MySQL) の中身を SQL 形式でダンプする PHP スクリプト

Posted in

mysqldump の代わりに使える PHP スクリプトが必要になり、探してみると下記ページを発見:
http://snipplr.com/view/173/mysql-dump/

試してみると、残念ながら(自分の目的には)そのままでは使えなかった。
主キーが複数あるテーブルの CREATE TABLE で PRIMARY KEY が正しく出力されないとか、null 値が空の文字列として INSERT されてしまうとか。

やむなく、最近老眼が入ってきた目を凝らしてコードを読み、少しだけ手を入れた。

header('Content-Type: application/octet-stream');
 
function nullcheck($values) {
 $ret = Array();
 foreach($values as $val) {
  if ($val===NULL) $ret[] = 'NULL';
  else $ret[] = '\'' . $val . '\'';
 }
 return $ret;
}
 
function mysql_dump($database) {
 $lnbr = "\r\n"; 
 $query = '';
 $tables = @mysql_list_tables($database);
 while ($row = @mysql_fetch_row($tables)) { $table_list[] = $row[0]; }
  for ($i = 0; $i < @count($table_list); $i++) {
   $results = mysql_query('SHOW CREATE TABLE ' . $database . '.' . $table_list[$i]);
   $query .= 'DROP TABLE IF EXISTS `' . $table_list[$i] . '`;' . str_repeat($lnbr, 2);
   while ($row = @mysql_fetch_assoc($results)) {
    $query .= $row['Create Table'] . ';';
   }
   $query .= str_repeat($lnbr, 2);
   $results = mysql_query('SELECT * FROM ' . $database . '.' . $table_list[$i]);
   while ($row = @mysql_fetch_assoc($results)) {
    $query .= 'INSERT INTO `' . $table_list[$i] .'` (';
    $data = Array();
    while (list($key, $value) = @each($row)) { $data['keys'][] = $key; $data['values'][] = ($value===NULL) ? NULL : addslashes($value); }
     $query .= join($data['keys'], ', ') . ')' . $lnbr . 'VALUES (' . str_replace("\r\n",'\r\n', join(nullcheck($data['values']), ', ')) . ');' . $lnbr;
   }
   $query .= str_repeat($lnbr, 2);
  }
 return $query;
}
 
$db = mysql_connect("db_host", "db_user", "db_pass");
if (!$db) {
die('failed to open the database');
}
echo mysql_dump("db_name");
mysql_close($db);

保存したファイルを phpmyadmin でインポートして無事目的を果たした。
(MySQL、PHP ともバージョンは 5)

#使いきりスクリプトにて他所で使ってどうなっても知りません。