1.html页面
data.html
<div class="row data-list">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
备份文件
</div>
<div class="panel-body">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>文件名称</th>
<th>时间</th>
<th>大小</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{volist name='list' id='v'}
<tr class="tr-list">
<td>{$v.name}</td>
<td>{$v.time}</td>
<td>{$v.size}</td>
<td><a onClick="do_red('{$v.name}');">还原</a></td>
</tr>
{/volist}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
//前端layer框架
function do_red(name)
{
layer.confirm('确认要还原数据库吗',function(index){
$.post("{:url('do_red')}", {name: name}, function(data) {
layer.msg(data.msg,{icon:1,time:2000});
});
});
}
</script>2.PHP代码//页面渲染
public function data()
{
//读取数据库备份文件(大家根据自己的实际路径修改)
$dir = ROOT_PATH.'/data/';
//SQL文件数组
$list = [];
if (is_dir($dir)) {
$fileList = scandir($dir);
foreach ($fileList as $key => $val) {
if( $val=='.' || $val=='..'){
continue;
}
//文件名称
$list[$key]['name']=$val;
//时间
$list[$key]['time'] = date('Y-m-d H:i:s',filemtime($dir.'/'.$val));
//大小
$filesize = filesize($dir.'/'.$val);
if ($filesize>0 && $filesize<=1024) {
$filesize=1;
} else {
$filesize=ceil($filesize/1024);
}
$list[$key]['size'] = $filesize.'KB';
}
if (count($list) > 0) {
$this->assign('list',$list);
} else {
echo '没有SQL文件';
}
} else {
echo '目录不存在';
}
return $this->fetch();
}
//数据库还原
public function do_red($name)
{
header("content-type:text/html;charset=utf-8");
$file = ROOT_PATH.'/data/'.$name; //还原的SQL文件
$tablepre = 'jd_'; //表前缀
if (!file_exists($file)) {
return ['status'=>-1, 'msg'=>'文件不存在'];
}
$sqldata = file_get_contents($file); //读取数据文件
$sqlFormat = $this->sql_split($sqldata, $tablepre); //获取SQl语句数组
//清空原有数据(要做好备份哦)
$info = Db::getConfig();
$dbname = $info['database']; //获取当前数据库
$tables = Db::query("show tables"); //读取所有表
foreach ($tables as $key => $value) {
$table = $value["Tables_in_$dbname"];
Db::execute("delete from $table");
}
$counts = count($sqlFormat);
$arr = [];
for ($i = $n = 0; $i < $counts; $i++) {
$sql = trim($sqlFormat[$i]);
if (strstr($sql, 'INSERT INTO')) { //读取所有的INSERT语句
$arr[] = $sql;
Db::execute($sql);
}
}
return ['status'=>1, 'msg'=>'数据已还原', 'arr'=>$arr];
}
//函数功能:将SQL语句组装成数组
function sql_split($sql, $tablepre) {
if ($tablepre != "jd_") {
$sql = str_replace("jd_", $tablepre, $sql);
}
$sql = preg_replace("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/", "ENGINE=\\1 DEFAULT CHARSET=utf8", $sql);
$sql = str_replace("\r", "\n", $sql);
$ret = array();
$num = 0;
$queriesarray = explode(";\n", trim($sql));
unset($sql);
foreach ($queriesarray as $query) {
$ret[$num] = '';
$queries = explode("\n", trim($query));
$queries = array_filter($queries);
foreach ($queries as $query) {
$str1 = substr($query, 0, 1);
if ($str1 != '#' && $str1 != '-')
$ret[$num] .= $query;
}
$num++;
}
return $ret;
} 最佳答案