用 PHP 导出 MySQL 数据库内容为 .sql 文件

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

通常我们都用 phpMyAdmin 来导出,不过如果你的数据库如果存在下列问题,那么 phpMyAdmin 也无能为力。

  • 数据库的字符集与应用程序的字符集不一致;
  • 应用程序用错误的编码将数据保存到了数据库中;
  • 用 phpMyAdmin 和 mysqldump 导出的数据总是乱码。

总之你用 phpMyAdmin 和 mysqldump 导出的数据有乱码时,就试试看这个脚本吧。

使用很简单:

php export_db.php 数据库名 [-h 主机名] [-c 字符集] [-f 输出文件名] [-u 用户名] [-p]  
数据库名是必须提供的,其他参数如果没有提供则使用下面的
默认值:     
默认主机名 : localhost     
默认字符集 : utf8     
默认用户名 : root     
默认密码 : (无)     
默认输出文件 : 数据库名.sql 

这个脚本的导出结果就是一个 .sql 文件,只有 insert 语句。
所以数据结构需要单独导出,不过这个就不存在字符集问题了。

源代码:

<? php

if  ( ! function_exists ( ' mysql_connect ' )) {
    
if  (DIRECTORY_SEPARATOR  ==   ' / ' ) {
        
dl ( ' php_mysql.so ' );
    } 
else  {
        
dl ( ' php_mysql.dll ' );
    }
}

$database   =   null ;
if  ( isset ( $argv [ 1 ])) 
{
    
$database   =   $argv [ 1 ];
else  {
    display_help();
    
exit ;
}

$optional_args   =   array (
    
' -h '   =>   ' hostname ' ,  
    
' -c '   =>   ' charset ' ,  
    
' -f '   =>   ' filename ' ,  
    
' -u '   =>   ' username '
);

$options   =   array (
    
' hostname '   =>   ' localhost ' ,
    
' charset '   =>   ' utf8 ' ,
    
' filename '   =>   ' %s.sql ' ,
    
' username '   =>   ' root ' ,
);

$input_password   =   false ;
for  ( $i   =   2 $i   <   $argc $i ++ ) {
    
$arg   =   $argv [ $i ];
    
if  ( $arg   ==   ' -p ' ) {
        
$input_password   =   true ;
        
continue ;
    }
    
if  ( isset ( $optional_args [ $arg ])) {
        
$value_name   =   $optional_args [ $arg ];
        
if  ( isset ( $argv [ $i   +   1 ])) {
            
$options [ $value_name =   $argv [ $i   +   1 ];
            
$i ++ ;
        }
    }
}

if  ( $input_password ) {
    
echo   " password:  " ;
    
fscanf (STDIN ,   ' %s ' ,   $password );
    
$options [ ' password ' =   $password ;
    
echo   " " ;
else  {
    
$options [ ' password ' =   '' ;
}

if  ( $database   ==   null ) {
    display_help();
    
exit ;
}


mysql_connect ( $options [ ' hostname ' ] ,   $options [ ' username ' ] ,   $options [ ' password ' ]);
mysql_select_db ( $database );
mysql_query ( " SET NAMES '{$options['charset']}' " );

echo   $options [ ' hostname ' ];
echo   " " ;
echo   $options [ ' username ' ];
echo   " " ;
echo   $options [ ' password ' ];
echo   " " ;
echo   $database ;
echo   " " ;

 
//  设置要导出的表
$tables   =  list_tables( $database );

$filename   =   sprintf ( $options [ ' filename ' ] ,   $database );
$fp   =   fopen ( $filename ,   ' w ' );
foreach  ( $tables   as   $table ) {
    dump_table(
$table ,   $fp );
}
fclose ( $fp );
mysql_close ();
echo   " done. " ;
exit ;
 

function  list_tables( $database )
{
    
$rs   =   mysql_list_tables ( $database );
    
$tables   =   array ();
    
while  ( $row   =   mysql_fetch_row ( $rs )) {
        
$tables []  =   $row [ 0 ];
    }
    
mysql_free_result ( $rs );
    
return   $tables ;
}

function  dump_table( $table ,   $fp   =   null )
{
    
$need_close   =   false ;
    
if  ( is_null ( $fp )) {
        
$fp   =   fopen ( $table   .   ' .sql ' ,   ' w ' );
        
$need_close   =   true ;
    }
    
fwrite ( $fp ,   " --  -- {$table} --  " );
    
$rs   =   mysql_query ( " SELECT * FROM `{$table}` " );
    
while  ( $row   =   mysql_fetch_row ( $rs )) {
        
fwrite ( $fp ,  get_insert_sql( $table ,   $row ));
    }
    
mysql_free_result ( $rs );
    
if  ( $need_close ) {
        
fclose ( $fp );
    }
    
fwrite ( $fp ,   " " );
}

function  get_insert_sql( $table ,   $row )
{
    
$sql   =   " INSERT INTO `{$table}` VALUES ( " ;
    
$values   =   array ();
    
foreach  ( $row   as   $value ) {
        
$values []  =   " ' "   .   mysql_real_escape_string ( $value .   " ' " ;
    }
    
$sql   .=   implode ( ' ' ,   $values .   " ); " ;
    
return   $sql ;
}

function  display_help()
{
    
echo   <<< EOT

syntax
:
    php export_db
. php database [ - h hostname] [ - c charset] [ - f filename] [ - u username] [ - p]

    defualt hostname 
:  localhost
    
default  charset   :  utf8
    
default  username  :  root
    
default  password  :  (none)
    
default  filename  :  [database] . sql

EOT;
}

?>

 

php export_db.php ALTEIL2 -h 192.168.0.77 -c utf8 -f mysql_20070606bak.sql -p

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值