企业官网建站 小程序开发 云逸学习园地
技术文章 许愿墙
技术文章 PHP学习 Javascript学习 DIV+CSS学习 uniapp学习 HTML学习 微信小程序、公众号知识点 VUE知识学习
您所在的位置>云逸小栈>PHP学习>正文

php备份mysql数据库、恢复(导入)mysql数据库

2024-08-09 14:00:43 浏览 1575
<?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('删除备份成功');
    }
}
}


网站开发者电话

18066742510

个人微信号
个人公众号
个人小程序
个人抖音