laravel 数据库安全备份

在app下创建Libs加载文件夹

把加载的Backup.php放进去

<?php
//defined('BASEPATH') OR exit('No direct script access allowed');
class Backup{
    private $handler;
    private $config = array(
        'host' => '47.93.196.95',
        'port' => 3306,
        'user' => 'root',
        'password' => 'root',
        'database' => 'laravel',
        'charset' => 'utf8',
        'target' => './backup/sql.sql' //备份文件存储路径
    );
    private $tables = array();
    private $error;
    private $begin; //开始时间
    /**
     * 架构方法
     * @param array $config
     */
    public function __construct($config = array())
    {
        $this->begin = microtime(true);
        $config = is_array($config) ? $config : array();
        $this->config = array_merge($this->config, $config);
        //启动PDO连接
        try
        {
            $this->handler = new PDO("mysql:host={$this->config['host']}:{$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);
            $this->handler->query('set names utf8');
        }
        catch (PDOException $e)
        {
            $this->error = $e->getMessage();
            return false;
        }
        catch (Exception $e)
        {
            $this->error = $e->getMessage();
            return false;
        }
    }


    /**
     * 备份
     * @param array $tables
     * @return bool
     */
    public function backup($tables = array())
    {
        //存储表定义语句的数组
        $ddl = array();
        //存储数据的数组
        $data = array();
        $this->setTables($tables);
        if (!empty($this->tables))
        {
            foreach ($this->tables as $table)
            {
                $ddl[] = $this->getDDL($table);
                $data[] = $this->getData($table);
            }
            //开始写入
            $result=$this->writeToFile($this->tables, $ddl, $data);
            if($result)
            {
                return true;
            }else{
                return false;
            }
        }
        else
        {
            $this->error = '数据库中没有表!';
            return false;
        }
    }


    /**
     * 设置要备份的表
     * @param array $tables
     */
    private function setTables($tables = array())
    {
        if (!empty($tables) && is_array($tables))
        {
            //备份指定表
            $this->tables = $tables;
        }
        else
        {
            //备份全部表
            $this->tables = $this->getTables();
        }
    }


    /**
     * 查询
     * @param string $sql
     * @return mixed
     */
    private function query($sql = '')
    {
        $stmt = $this->handler->query($sql);
        $stmt->setFetchMode(PDO::FETCH_NUM);
        $list = $stmt->fetchAll();
        return $list;
    }


    /**
     * 获取全部表
     * @return array
     */
    private function getTables()
    {
        $sql = 'SHOW TABLES';
        $list = $this->query($sql);
        $tables = array();
        foreach ($list as $value)
        {
            $tables[] = $value[0];
        }
        return $tables;
    }


    /**
     * 获取表定义语句
     * @param string $table
     * @return mixed
     */
    private function getDDL($table = '')
    {
        $sql = "SHOW CREATE TABLE `{$table}`";
        $ddl = $this->query($sql)[0][1] . ';';
        return $ddl;
    }


    /**
     * 获取表数据
     * @param string $table
     * @return mixed
     */
    private function getData($table = '')
    {
        $sql = "SHOW COLUMNS FROM `{$table}`";
        $list = $this->query($sql);
        //字段
        $columns = '';
        //需要返回的SQL
        $query = '';
        foreach ($list as $value)
        {
            $columns .= "`{$value[0]}`,";
        }
        $columns = substr($columns, 0, -1);
        $data = $this->query("SELECT * FROM `{$table}`");
        foreach ($data as $value)
        {
            $dataSql = '';
            foreach ($value as $v)
            {
                $dataSql .= "'{$v}',";
            }
            $dataSql = substr($dataSql, 0, -1);
            $query .= "INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\r\n";
        }
        return $query;
    }


    /**
     * 写入文件
     * @param array $tables
     * @param array $ddl
     * @param array $data
     */
    private function writeToFile($tables = array(), $ddl = array(), $data = array())
    {
        $str = "/*\r\nMySQL Database Backup Tools\r\n";
        $str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n";
        $str .= "Database:{$this->config['database']}\r\n";
        $str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n";
        $str .= "SET FOREIGN_KEY_CHECKS=0;\r\n";
        $i = 0;
        foreach ($tables as $table)
        {
            $str .= "-- ----------------------------\r\n";
            $str .= "-- Table structure for {$table}\r\n";
            $str .= "-- ----------------------------\r\n";
            $str .= "DROP TABLE IF EXISTS `{$table}`;\r\n";
            $str .= $ddl[$i] . "\r\n";
            $str .= "-- ----------------------------\r\n";
            $str .= "-- Records of {$table}\r\n";
            $str .= "-- ----------------------------\r\n";
            $str .= $data[$i] . "\r\n";
            $i++;
        }
        if(file_put_contents($this->config['target'], $str))
        {
            return true;
        }else{
            return false;
        }
    }


    /**
     * 错误信息
     * @return mixed
     */
    public function getError()
    {
        return $this->error;
    }




    /**
     *数据恢复
     */
    public function restore($path="")
    {
        if (!file_exists($path))
        {
            return false;
        }
        else
        {
            $sql = $this->parseSQL($path);
            try
            {
                $this->handler->exec($sql);
                return true;
            }
            catch (PDOException $e)
            {
                $this->error = $e->getMessage();
                return false;
            }
        }
    }


    /**
     * 解析SQL文件为SQL语句数组
     * @param string $path
     * @return array|mixed|string
     */
    private function parseSQL($path = '')
    {
        $sql = file_get_contents($path);
        $sql = explode("\r\n", $sql);
        //先消除--注释
        $sql = array_filter($sql, function ($data)
        {
            if (empty($data) || preg_match('/^--.*/', $data))
            {
                return false;
            }
            else
            {
                return true;
            }
        });
        $sql = implode('', $sql);
        //删除/**/注释
        $sql = preg_replace('/\/\*.*\*\//', '', $sql);
        return $sql;
    }
}

 

 

根目录下的composer.json添加加载的文件,在

"autoload-dev": {
        "classmap": [
            "app/Libs/Backup.php"
        ]
    },

命令行更行

composer   dumpautoload

 

控制器

public function index(){
        $mysql_cory = new Backup();
        $res = $mysql_cory->backup();
        if ($res){
            echo "<script>alert('数据库备案成功')</script>";
        }else{
            echo "<script>alert('数据库备案失败')</script>";
        }
    }
    public function loca(){
        $mysql_cory = new Backup();
        $res = $mysql_cory->restore('./backup/sql.sql');
        if ($res){
            echo "<script>alert('数据库恢复成功')</script>";
        }else{
            echo "<script>alert('数据库恢复失败')</script>";
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Laravel 升级的过程需要遵循一些步骤,以确保升级后的应用程序仍然正常运行。下面是一般的升级步骤: 1. 备份代码和数据库:在升级之前,请确保您已经备份了代码和数据库,以防出现任何意外情况。 2. 确定升级路径:确定您要从哪个版本升级到哪个版本,并确保升级路径是正确的。 3. 更新 composer.json:修改 composer.json 文件以指示要升级到的 Laravel 版本。 4. 执行 composer update:使用 composer update 命令更新 Laravel 包。 5. 更新代码:如果在新版本中有任何代码变更,请更新代码以适应升级。 6. 测试:运行应用程序并测试功能,以确保升级后应用程序正常运行。 7. 部署:如果一切正常,请将更新的代码和包部署到生产环境。 请注意,每个版本的升级都有其特定的说明,因此请在升级之前仔细阅读官方文档。 ### 回答2: Laravel 是一个流行的 PHP 框架,它不断地通过发布新的版本来增强其功能和修复已知的问题。升级 Laravel 版本是为了获取这些新的功能和修复。 Laravel 的升级过程可以分为以下步骤: 1. 阅读文档:在升级 Laravel 版本之前,你应该先阅读 Laravel 的官方文档。文档中会提供关于新功能的详细解释和操作步骤。 2. 确定目标版本:确定你要升级到的 Laravel 版本。你可以根据自己的需求和项目的要求来选择合适的版本。 3. 创建备份:在升级之前,务必先创建一个完整的项目备份。这样可以在升级失败或出现问题时恢复到之前的稳定状态。 4. 更新 Composer.json:在项目根目录下的 `composer.json` 文件中,更新 Laravel 的版本要求。通过运行 `composer update` 命令可以更新项目依赖,下载新版本的 Laravel。 5. 数据库迁移:在 Laravel 中,数据表结构的变化通过数据库迁移来进行管理。升级 Laravel 版本后,需要运行相应的数据库迁移命令,确保数据库与新版本兼容。 6. 代码修复:升级可能会导致一些代码不兼容的问题。在升级后检查并修复这些问题,确保项目能够正常运行。 7. 更新依赖包:升级 Laravel 版本后,可能需要更新项目中使用的一些第三方依赖包。通过运行 `composer update` 命令可以更新这些依赖包。 8. 测试和部署:在升级完成后,进行全面的测试确保项目没有问题。然后可以将项目部署到生产环境中。 总的来说,Laravel 的升级过程需要谨慎地进行,并且最好在开发环境中先进行测试。确保备份项目和遵循官方文档中的指导,可以顺利地将项目升级到新版本,从而享受到更多的功能和修复。 ### 回答3: Laravel是一款流行的PHP开发框架,它经常会发布新版本来改进和增强其功能。升级Laravel可以带来许多好处,包括更好的性能、更安全的应用程序和更方便的开发体验。 升级Laravel的第一步是了解目前使用的是哪个版本。通过查看`composer.json`文件中的`"laravel/framework"`依赖项,可以确定当前使用的Laravel版本号。然后,可以去Laravel官方网站上查看最新的版本号。 在升级之前,建议备份代码和数据库。升级Laravel可能会导致一些兼容性问题,因此确保备份可以提供回滚的选择。 升级的过程通常是通过Composer来完成的。在终端中切换到项目目录,并运行`composer require laravel/framework:^x.x.x`(x.x.x是目标版本号)来升级Laravel核心组件。这将自动更新`composer.json`文件并下载所需的依赖项。 升级完成后,可能需要手动更新配置文件以适应新的版本。Laravel通常会发布升级指南,其中包含了该版本的具体修改内容和更新说明。遵循这些指南,可以确保应用程序在升级后正常工作。 一些第三方包可能也需要更新以支持新版本的Laravel。在升级之前,建议检查项目中使用的第三方包的文档,确认它们是否与目标版本兼容。 升级Laravel可能需要进行一些代码更改。某些更新可能会导致旧代码不再起作用或产生错误。因此,建议在升级之后进行测试和调试,以确保应用程序正常运行。 总之,升级Laravel可以让我们享受到更好的性能、更安全的应用程序和更方便的开发体验。在开始升级之前,确保备份代码和数据库,并仔细阅读升级指南和第三方包的文档,以确保顺利完成升级过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值