<?php
session_start();
ini_set('time_limit',3600);

//--------------- 参数配置 ---------------
define('CONF_DB_SERVER','127.0.0.1');
define('CONF_DB_USER','root');
define('CONF_DB_PASSWD','');
define('CONF_DB_CODE','utf8');
define('CONF_PASSWORD','123456');
define('CONF_CRLF',"\n");
define('CONF_EXPORT_DIR',"");

//--------------- 连接数据库 ---------------
mysql_connect(CONF_DB_SERVER,CONF_DB_USER,CONF_DB_PASSWD);
mysql_query('set names '.CONF_DB_CODE);

//--------------- 开始执行导出 ---------------
if(isset($_POST['act']) && $_POST['act'] == 'export'){
 $db = $_POST['db'];
 $file = CONF_EXPORT_DIR.$db."_".date('Ymd').".sql";
    @unlink($file);
   
    $str = 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";'."\n\n";
    $str .= '/*!40101 SET NAMES utf8 */;'."\n\n";
    //$str .= 'CREATE DATABASE IF NOT EXISTS `'.$db.'` DEFAULT CHARACTER SET '.CONF_DB_CODE.';'."\n\n";
    _log($str, $file);//防止导入乱码
 
 mysql_select_db($db);
 $sql = 'show tables';
 $q = mysql_query($sql);
 while($rs=mysql_fetch_row($q)){
  $str = '';
  $str = get_tbl_struct($rs[0]);
  _log($str, $file);//数据表结构
  get_table_content($rs[0], $file);//数据
 }
    die('finish');
}

//--------------- 查询全部数据库 ---------------
$sql = "SELECT lower(schema_name) schema_name FROM information_schema.schemata
WHERE schema_name NOT IN ('mysql','information_schema','test','search','tbsearch','sbtest','my_db','sys_info')";
$q = mysql_query($sql);
while($rs=mysql_fetch_row($q)){
    $db_list[] = $rs[0];
}

//$str = 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";'.CONF_CRLF;
function _log($str, $file){
    error_log($str, 3, $file);
}

//--------------- 数据库结构 ---------------
function get_tbl_struct($table){

    $sql = "show create table `$table`";
    $q = mysql_query($sql);
    $rs = mysql_fetch_row($q);
    $str = $rs[1];
    $str = "DROP TABLE IF EXISTS `$table`;\n".$str;
    $str = str_replace('CREATE TABLE','CREATE TABLE IF NOT EXISTS',$str);
   
    return $str.";\n\n";
}

//--------------- 数据表的数据 ---------------
function get_table_content($table, $file){

 $page_size = 1000;
 $max_page = 1;
 $insert_len = 30;
    $schema_create = " ";
    $temp = " ";
 
 $q = mysql_query("SELECT count(*) FROM $table");
 $rs = mysql_fetch_row($q);
 $total = $rs[0];
 $max_page = ceil($total/$page_size);
 if($total == 0) return false;
 
 //取出字段名称
 $sql = "show columns from `$table`";
 $q = mysql_query($sql);
 while($rs = mysql_fetch_array($q)){
  $tbl_fields[] = $rs['Field'];
 }
 
 $insert_header = "INSERT INTO `$table` (`".implode('`, `',$tbl_fields)."`) VALUES".CONF_CRLF;
    _log($insert_header, $file);
 
 $i = 0;
 for($page=0;$page<$max_page;$page++)
 {
        $result = mysql_query("SELECT * FROM $table LIMIT ".($page*$page_size).",$page_size");
        $curr_total = mysql_num_rows($result);
        $fields_meta = PMA_DBI_get_fields_meta($result);
        $search = array("\x00", "\x0a", "\x0d", "\x1a"); //\x08\\x09, not required
        $replace = array('\0', '\n', '\r', '\Z');
        $curr_i = 0;
  while($row = mysql_fetch_row($result))
  {
            $str = '(';
   for($j=0; $j<mysql_num_fields($result);$j++)
   {
    // NULL
                if (!isset($row[$j]) || is_null($row[$j])) {
                    $str .= 'NULL';
                // a number
                // timestamp is numeric on some MySQL 4.1, BLOBs are sometimes numeric
                } elseif ($fields_meta[$j]->numeric && $fields_meta[$j]->type != 'timestamp'
                        && ! $fields_meta[$j]->blob) {
                    $str .= $row[$j];
                // a true BLOB : 忽略了二进制数据处理
                } else {
                    $str .= '\'' . str_replace($search, $replace, PMA_sqlAddslashes($row[$j])) . '\'';
                } // end if
                if($j<mysql_num_fields($result)-1) $str .= ', ';
   }
   //$str = ereg_replace( ",$ ", " ", $str);
   $str .= ")";
   $i++;$curr_i++;
   if($i >= $total && $curr_i==$curr_total){
                $str .= ";".CONF_CRLF.CONF_CRLF;
            }elseif(($i%$insert_len==0)){
                $str .= ";".CONF_CRLF.$insert_header;
            }else{
                $str .= ",".CONF_CRLF;
            }
   _log($str, $file);
  }
 }
    return true;
}


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>MySQL数据库导出</title>
<style>
body {font-size:14px; font-family:Arial, Helvetica, sans-serif}
ul li{ padding:5px;}
label { width:160px;display:inline-block;font-size:12px; }
</style>
</head>

<body>
<ul>
    <li>
        数 据 库:(<?php echo(sizeof($db_list));?>) <input type="button" id="select_all" value="反选" /><br/>
  <?php foreach($db_list as $v):?>
  <label><input type="checkbox" name="db" checked="checked" value="<?php echo($v);?>" /> <?php echo($v);?></label> 
  <?php endforeach;?>
    </li>
    <li>
        导出选项:<br/>
        <label><input type="checkbox" name="e_struct" checked="checked" value="1" /> db struct</label> 
        <label><input type="checkbox" name="e_data" checked="checked" value="1" /> db data</label>
    </li>
 <li><input type="button" id="run" value="开始执行" /></li>
 <li id="status">....</li>
</ul>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.min.js"></script>
<script>
$(function(){
 $('#run').click(function(){
  run_export(0);
 });
   
    $('#select_all').click(function(){
  $('input[name="db"]').each(function(){
            if(this.checked) this.checked = false;
            else this.checked = true;
        });
 });
});

function run_export(i){
 var db = $('input[name="db"]:checked');
 $('#status').html('running : '+db[i].value);
 $.post('dump.php',{act:'export',db:db[i].value},function(data){
        $('#status').html(data+' : '+db[i].value);
        i ++;
        if(i < db.length){
            run_export(i);
        }else{
            alert('全部完成');
        }
 });
}
</script>
</body>
</html>
<?php
/**
 * @todo add missing keys like in from mysqli_query (orgname, orgtable, flags, decimals)
 */
function PMA_DBI_get_fields_meta($result) {
    $fields       = array();
    $num_fields   = mysql_num_fields($result);
    for ($i = 0; $i < $num_fields; $i++) {
        $fields[] = mysql_fetch_field($result, $i);
    }
    return $fields;
}

/**
 * Add slashes before "'" and "\" characters so a value containing them can
 * be used in a sql comparison.
 *
 * @uses    str_replace()
 * @param   string   the string to slash
 * @param   boolean  whether the string will be used in a 'LIKE' clause
 *                   (it then requires two more escaped sequences) or not
 * @param   boolean  whether to treat cr/lfs as escape-worthy entities
 *                   (converts \n to \\n, \r to \\r)
 *
 * @param   boolean  whether this function is used as part of the
 *                   "Create PHP code" dialog
 *
 * @return  string   the slashed string
 *
 * @access  public
 */
function PMA_sqlAddslashes($a_string = '', $is_like = false, $crlf = false, $php_code = false)
{
    if ($is_like) {
        $a_string = str_replace('\\', '\\\\\\\\', $a_string);
    } else {
        $a_string = str_replace('\\', '\\\\', $a_string);
    }

    if ($crlf) {
        $a_string = str_replace("\n", '\n', $a_string);
        $a_string = str_replace("\r", '\r', $a_string);
        $a_string = str_replace("\t", '\t', $a_string);
    }

    if ($php_code) {
        $a_string = str_replace('\'', '\\\'', $a_string);
    } else {
        $a_string = str_replace('\'', '\'\'', $a_string);
    }

    return $a_string;
} // end of the 'PMA_sqlAddslashes()' function
?>