<?php
/**
* 数据库备份还原
* @author Administrator
*
*/
namespace Admin\Controller;
use Think\Controller;
class DataController extends Controller{
private $hr = "\r\n\r\n"; //一定要是双引号才能换行
//数据管理首页
public function index(){
$rows = M('')->query('SHOW TABLE STATUS');
//打印 表名 用途 记录数 引擎 字符集 表大小k
//组合新数组
$total = 0;
foreach($rows as $k => $v){
$rows[$k]['size'] = byte_format($v['Data_length']+$v['Index_length']);
$total += $v['Data_length'] + $v['Index_length'];
}
$this->rows = $rows;
$this->sumTable = count($rows);
$this->total = byte_format($total);
$this->display();
}
//数据备份处理
public function backup(){
//获取要备份的表
//p(I('post.'));
$tables = I('table');
foreach($tables as $v){
list($table,$comment) = explode(',',$v);
$sql = $this->_create_table($table,$comment); //组合保存的sql语句
if($this->_data_dir($sql,$table)){
echo '完成表:'.$table.'的备份'.'<br/>';
}else{
$this->error('备份表:'.$table.'失败');
}
}
}
//传递一个表组合备份语句
private function _create_table($table,$comment){
//取得建表语句
$db = M('');
$result = $db->query('SHOW CREATE TABLE '.$table);
$sql = '#表名称:'.$table.$this->hr;
$sql .= '#用途:'.$comment.$this->hr;
$sql .= '#表单语句结构:'.$this->hr;
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`'.';'.$this->hr;
$sql .= $result[0]['Create Table'].';';
$sql .= $this->hr;
//连接上数据库数据
$insert = '#表数据:'.$this->hr;
$info = $db->query('SELECT * FROM '.$table);
foreach($info as $v){
$sum = 0;
$insert .= 'INSERT INTO `'.$table.'` VALUES (';
foreach($v as $key=>$values){
$insert .= $sum == 0 ? '' : ',';
$insert .= "'".$values."'";
$sum++;
}
$insert .= ');'.$this->hr;
}
$sql = $sql . $insert;
return $sql.$this->hr.$this->hr;
}
//在指定目录保存sql备份文件
private function _data_dir($sql,$table){
$dir = C('DATABACK_DIR');
//判断指定的备份目录是否存在
if(!is_dir($dir)){
mkdir($dir,0777,true) or '你没有权限,创建数据库备份目录失败';
}
//sql备份文件命名规则
$filename = $dir.$table.'_'.date('ymdH').'.txt';
if(file_put_contents($filename, $sql)){
return true;
}
}
//备份数据表导入
public function improtData($sqlFile = './databack/ym_user_14031616.txt'){
if(!file_exists($sqlFile)){
$this->error('出错啦!备份文件不存在!');
}
$f = fopen($sqlFile, rb);
$sql = '';
while(!feof($f)){
$sql .= fgets($f);
}
fclose($f);
//确认读完,开始发送到数据库进行执行
if(M()->query($sql)){
$this->error('还原失败!请检查。');
}else{
$this->success('还原成功!');
}
}
}
最佳答案