<?php
namespace app\admin\controller;
use think\Db;
use think\Exception;
use think\Request;
class Backdata extends Common
{
public function __construct(Request $request = null)
{
parent::__construct($request);
}
public function lst(){
return view('lst',[
'count'=>0
]);
}
//备份数据库
public function add(){
$path = ROOT_PATH.'public/data';
$dbname=config("database.database");
if(!is_dir($path)) {
//新建目录
mkdir($path, 0777, true);
}
//检查目录是否可写
if(!is_writable($path)) {
chmod($path,0777);
}
//检查文件是否存在
$fileName=$dbname.'_'.date("Y-m-d",time()).'.sql';
$savepath = $path.'/'.$fileName;
try {
if(!file_exists($savepath)){
$version=Db::query("select version() as ver");
print_r($version);
$ver = $version[0]['ver'];
$info = "-- ----------------------------\r\n";
$info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
$info .= "-- MySQL - ".$ver." : Database - ".$dbname."\r\n";
$info .= "-- ----------------------------\r\n\r\n";
$info .= "CREATE DATAbase IF NOT EXISTS `".$dbname."` DEFAULT CHARACTER SET utf8 ;\r\n\r\n";
$info .= "USE `".$dbname."`;\r\n\r\n";
file_put_contents($savepath,$info,FILE_APPEND);
//查询所有表
$sql="show tables";
//执行原生SQL语句
$result=Db::query($sql);
foreach ($result as $k=>$v) {
//查询表结构
$table = $v['Tables_in_'.$dbname];
$sql_table = "show create table ".$table;
$res = Db::query($sql_table);
$info_table = "-- ----------------------------\r\n";
$info_table .= "-- Table structure for `".$table."`\r\n";
$info_table .= "-- ----------------------------\r\n\r\n";
$info_table .= "DROP TABLE IF EXISTS `".$table."`;\r\n\r\n";
$info_table .= $res[0]['Create Table'].";\r\n\r\n";
//查询表数据
$info_table .= "-- ----------------------------\r\n";
$info_table .= "-- Data for the table `".$table."`\r\n";
$info_table .= "-- ----------------------------\r\n\r\n";
file_put_contents($savepath,$info_table,FILE_APPEND);
$sql_data = "select * from ".$table;
$data = Db::query($sql_data);
$count= count($data);
if($count<1) continue;
foreach ($data as $key => $value) {
$sqlStr = "INSERT INTO `{$table}` VALUES (";
foreach($value as $column) {
//对单引号和换行符进行一下转义
$column = str_replace( array("'","\r\n"), array("\'","\\r\\n"),$column);
//当值为空时,使用default默认
$sqlStr .=empty($column) ? "default, " : "'".$column."', ";
}
//去掉最后一个逗号和空格
$sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
$sqlStr .= ");\r\n";
file_put_contents($savepath,$sqlStr,FILE_APPEND);
}
$info = "\r\n";
file_put_contents($savepath,$info,FILE_APPEND);
}
//计算文件大小
$size=filesize($savepath);
$this->success("数据库备份成功:名称:$fileName,大小:$size",url('Index/index'),5);
}else{
$this->error('今天的数据库已经备份,请不要重复备份');
}
}catch (Exception $e){
$this->error('数据库备份失败');
}
}
/**
* 将sql文件导入到数据库
*
* @param string $sqlfile sql文件
*/
public static function import($sqlfile) {
if(!file_exists($sqlfile)) {
return array('code' => 0, 'msg' => '备份文件不存在');
}
try {
// 创建保存sqlsql语句的数组
$sqls = array ();
$file = fopen ($sqlfile, "rb" );
// 创建表缓冲变量
$table_buffer = '';
while ( ! feof ($file) ) {
// 读取每一行sql
$row = fgets ( $file);
// 如果结尾没有包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句)
if (! preg_match ( '/;/', $row ) || preg_match ( '/ENGINE=/', $row )) {
// 将本次sql语句与创建表sql连接存起来
$table_buffer .= $row;
// 如果包含了创建表的最后一句
if (preg_match ( '/ENGINE=/', $table_buffer)) {
//执行sql语句创建表
Db::execute($table_buffer);
// 清空当前,准备下一个表的创建
$table_buffer = '';
}
// 跳过本次
continue;
}
//执行sql语句
Db::execute($row);
}
fclose ($file);
return array('code' => 1, 'msg' => '还原数据库成功');
}
catch (\Exception $e) {
return array('code' => 0, 'msg' => '还原数据库失败,Error:'.$e);
}
}
/**
** @name='删除'
*/
public function del()
{
if(request()->isPost()){
$data=input('post.');
!isset($data['id']) && $this->error('参数非法');
!is_numeric(trim($data['id'])) && $this->error('参数非法');
Db::startTrans();
try{
$file = DatabaseModel::field('path')->where('id',intval($data['id']))->find();
$path=ROOT_PATH.$file['path'];
if(file_exists($path)){
//thinkphp使用unlink函数来删除文件,参数是文件的地址
unlink($path);
}
DatabaseModel::where('id',intval($data['id']))->delete();
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$this->error('删除备份失败');
}
$this->success('删除备份成功');
}
}
}