+ -
当前位置:首页 → 问答吧 → 挤牙膏挤出来的数据库备份类

挤牙膏挤出来的数据库备份类

时间:2010-10-06

来源:互联网



前段时间看有人弄过这个东西,但是是备份的文件在服务器上,而且文件太多,我不喜欢,昨天自己尝试着写了一个,以前一直没搞过这东西,昨天试了一下,真的像挤牙膏一样的弄出来的。

使用超级简单,只需要扔进lib里面,再调用Bak模块就OK了,在数据记录很多的情况下没有测试。

希望高手可以有更好的办法。
  1. <?php
  2. header('Content-type:text/html; charset=utf-8');
  3. Header("Content-type: application/octet-stream");
  4. header("Content-Disposition:attachment; filename=".date( 'YmdHis ').".sql");
  5. class BakAction extends Action{
  6. /**
  7. *返回数据库中的数据表
  8. */
  9. protected function getTable(){
  10.   $dbName=C('DB_NAME');
  11.   $result=M()->query('show tables from '.$dbName);
  12.   foreach ($result as $v){
  13.       $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
  14.   }
  15.   return $tbArray;
  16. }


  17. public function index(){
  18.   $table=$this->getTable();
  19.   $struct=$this->bakStruct($table);
  20.   $record=$this->bakRecord($table);
  21.   echo $struct;
  22.   echo $record;
  23. }

  24. /**
  25. *备份数据表结构
  26. */
  27. protected function bakStruct($array){
  28.   
  29.   foreach ($array as $v){
  30.   
  31.    $tbName=$v;
  32.    
  33.    $result=M()->query('show columns from '.$tbName);
  34.    $sql.="--\r\n";
  35.    $sql.="-- 数据结构: `$tbName`\r\n";
  36.    $sql.="--\r\n\r\n";
  37.    
  38.    $sql.="create table `$tbName` (\r\n";
  39.    $rsCount=count($result);
  40.    
  41.    foreach ($result as $k=>$v){
  42.    
  43.            $field  =       $v['Field'];
  44.            $type   =       $v['Type'];
  45.            $default=       $v['Default'];
  46.            $extra  =       $v['Extra'];
  47.            $null   =       $v['Null'];
  48.      if(!($default=='')){
  49.       $default='default '.$default;
  50.      }
  51.            
  52.            if($null=='NO'){
  53.                $null='not null';
  54.            }else{
  55.                $null="null";
  56.            }           
  57.            
  58.            if($v['Key']=='PRI'){
  59.                    $key    =       'primary key';
  60.            }else{
  61.                    $key    =       '';
  62.            }
  63.      if($k<($rsCount-1)){
  64.       $sql.="`$field` $type $null $default $key $extra ,\r\n";
  65.      }else{
  66.       //最后一条不需要","号
  67.       $sql.="`$field` $type $null $default $key $extra \r\n";
  68.      }

  69.    }
  70.    $sql.=")engine=innodb charset=utf8;\r\n\r\n";
  71.   }
  72.   return str_replace(',)',')',$sql);
  73. }



  74. protected function bakRecord($array){

  75.      foreach ($array as $v){
  76.   
  77.    $tbName=$v;
  78.       
  79.       $rs=M()->query('select * from '.$tbName);
  80.       
  81.       if(count($rs)<=0){
  82.           continue;
  83.       }
  84.    $sql.="--\r\n";
  85.    $sql.="-- 数据表中的数据: `$tbName`\r\n";
  86.    $sql.="--\r\n\r\n";
  87.       foreach ($rs as $k=>$v){
  88.           $sql.="INSERT INTO `$tbName` VALUES (";
  89.        foreach ($v as $key=>$value){
  90.            if($value==''){
  91.                $value='null';
  92.            }
  93.            $type=gettype($value);
  94.            if($type=='string'){
  95.                $value="'".addslashes($value)."'";
  96.            }
  97.            $sql.="$value," ;
  98.        }
  99.        $sql.=");\r\n\r\n";
  100.          }
  101.   }
  102.   return str_replace(',)',')',$sql);
  103. }
  104. }
  105. ?>
复制代码

作者: tydgb   发布时间: 2010-10-06

支持共享。

作者: shuro   发布时间: 2010-10-06

shuro

刚才修改了一下,看起来更加好看了,测试了我的blog备份,一切OK

作者: tydgb   发布时间: 2010-10-06

挤牙膏?呵呵,我写东西好像一直都是挤牙膏

作者: nuan1989   发布时间: 2010-10-06

心里面没什么思路,想到哪写到哪。

作者: tydgb   发布时间: 2010-10-06

ThinkMyAdmin..少许代码一看便知。。

作者: cain   发布时间: 2010-10-07

cain
NO,并不是抄的thinkMyadmin

thinkmyadmin今天才听你说有这么个东东,一直用的phpmyadmin

是我自己想的,生成的SQL格式是抄的phpmyadmin的

作者: tydgb   发布时间: 2010-10-07

你这个备份数据库,格式被指定为  utf-8???


GBK的可以备份吗?

作者: xtrgw   发布时间: 2010-10-08

tydgb

-_-哥有说你抄么

作者: cain   发布时间: 2010-10-11

第10行有个BUG,对有大写字母的数据库名有问题,
应改为strtolower(C('DB_NAME'));

作者: 舞林   发布时间: 2011-04-29