挤牙膏挤出来的数据库备份类
时间:2010-10-06
来源:互联网
前段时间看有人弄过这个东西,但是是备份的文件在服务器上,而且文件太多,我不喜欢,昨天自己尝试着写了一个,以前一直没搞过这东西,昨天试了一下,真的像挤牙膏一样的弄出来的。
使用超级简单,只需要扔进lib里面,再调用Bak模块就OK了,在数据记录很多的情况下没有测试。
希望高手可以有更好的办法。
- <?php
- header('Content-type:text/html; charset=utf-8');
- Header("Content-type: application/octet-stream");
- header("Content-Disposition:attachment; filename=".date( 'YmdHis ').".sql");
- class BakAction extends Action{
- /**
- *返回数据库中的数据表
- */
- protected function getTable(){
- $dbName=C('DB_NAME');
- $result=M()->query('show tables from '.$dbName);
- foreach ($result as $v){
- $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
- }
- return $tbArray;
- }
-
-
- public function index(){
- $table=$this->getTable();
- $struct=$this->bakStruct($table);
- $record=$this->bakRecord($table);
- echo $struct;
- echo $record;
- }
-
- /**
- *备份数据表结构
- */
- protected function bakStruct($array){
-
- foreach ($array as $v){
-
- $tbName=$v;
-
- $result=M()->query('show columns from '.$tbName);
- $sql.="--\r\n";
- $sql.="-- 数据结构: `$tbName`\r\n";
- $sql.="--\r\n\r\n";
-
- $sql.="create table `$tbName` (\r\n";
- $rsCount=count($result);
-
- foreach ($result as $k=>$v){
-
- $field = $v['Field'];
- $type = $v['Type'];
- $default= $v['Default'];
- $extra = $v['Extra'];
- $null = $v['Null'];
- if(!($default=='')){
- $default='default '.$default;
- }
-
- if($null=='NO'){
- $null='not null';
- }else{
- $null="null";
- }
-
- if($v['Key']=='PRI'){
- $key = 'primary key';
- }else{
- $key = '';
- }
- if($k<($rsCount-1)){
- $sql.="`$field` $type $null $default $key $extra ,\r\n";
- }else{
- //最后一条不需要","号
- $sql.="`$field` $type $null $default $key $extra \r\n";
- }
-
- }
- $sql.=")engine=innodb charset=utf8;\r\n\r\n";
- }
- return str_replace(',)',')',$sql);
- }
-
-
-
- protected function bakRecord($array){
-
- foreach ($array as $v){
-
- $tbName=$v;
-
- $rs=M()->query('select * from '.$tbName);
-
- if(count($rs)<=0){
- continue;
- }
- $sql.="--\r\n";
- $sql.="-- 数据表中的数据: `$tbName`\r\n";
- $sql.="--\r\n\r\n";
- foreach ($rs as $k=>$v){
- $sql.="INSERT INTO `$tbName` VALUES (";
- foreach ($v as $key=>$value){
- if($value==''){
- $value='null';
- }
- $type=gettype($value);
- if($type=='string'){
- $value="'".addslashes($value)."'";
- }
- $sql.="$value," ;
- }
- $sql.=");\r\n\r\n";
- }
- }
- return str_replace(',)',')',$sql);
- }
- }
- ?>
作者: tydgb 发布时间: 2010-10-06
作者: shuro 发布时间: 2010-10-06
刚才修改了一下,看起来更加好看了,测试了我的blog备份,一切OK
作者: tydgb 发布时间: 2010-10-06
作者: nuan1989 发布时间: 2010-10-06
作者: tydgb 发布时间: 2010-10-06
作者: cain 发布时间: 2010-10-07
NO,并不是抄的thinkMyadmin
thinkmyadmin今天才听你说有这么个东东,一直用的phpmyadmin
是我自己想的,生成的SQL格式是抄的phpmyadmin的
作者: tydgb 发布时间: 2010-10-07
GBK的可以备份吗?
作者: xtrgw 发布时间: 2010-10-08
-_-哥有说你抄么
作者: cain 发布时间: 2010-10-11
应改为strtolower(C('DB_NAME'));
作者: 舞林 发布时间: 2011-04-29
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28