tp5数据库还原(备忘,继tp5备份mysql数据库)

浏览:1646 发布日期:2018/06/28 分类:技术分享 关键字: thinkphp5 数据库还原
thinkphp版本5.0.10

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;
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>