研究pbootcms后台备份数据库方法

www.jswusn.com PHP 2024-09-02 09:47:52 9次浏览


研究pbootcms后台备份数据库方法

1、备份文件头部说明

// 插入数据库备份基础信息
    private function header()
    {
        $sql = '-- Online Database Management SQL Dump' . PHP_EOL;
        $sql .= '-- 数据库名: ' . $this->dbauth['dbname'] . PHP_EOL;
        $sql .= '-- 生成日期: ' . date('Y-m-d H:i:s') . PHP_EOL;
        $sql .= '-- PHP 版本: ' . phpversion() . PHP_EOL . PHP_EOL;
        
        $sql .= 'SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";' . PHP_EOL;
        $sql .= 'SET time_zone = "+08:00";' . PHP_EOL;
        $sql .= 'SET NAMES utf8;' . PHP_EOL . PHP_EOL;
        
        $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL;
        return $sql;
    }


2、数据库创建语句

    // 数据库创建语句
    private function dbSql()
    {
        $sql = '';
        $sql .= "--" . PHP_EOL;
        $sql .= "-- 数据库名 `" . $this->dbauth['dbname'] . '`' . PHP_EOL;
        $sql .= "--" . PHP_EOL . PHP_EOL;
        
        // 如果数据库不存在则创建
        $sql .= "CREATE DATABASE IF NOT EXISTS `" . $this->dbauth['dbname'] . '` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' . PHP_EOL;
        // 选择数据库
        $sql .= "USE `" . $this->dbauth['dbname'] . "`;" . PHP_EOL . PHP_EOL;
        $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL;
        return $sql;
    }


3、获取所有表

// 获取全部表
public function getTables()
{
    $result = parent::all('SHOW TABLES', 2);
    foreach ($result as $value) {
        $tables[] = $value[0];
    }
    return $tables;
}


4、循环表结构以及数据,并且生成sql数据语句

foreach ($tables as $table) { // 表结构及数据
    $sql .= $this->tableSql($table); // 表结构信息
    $fields = $this->model->getFields($table); // 表字段
    $field_num = $this->model->getFieldNum($table); // 字段数量
    $all_data = $this->model->getAll($table); // 读取全部数据
    if ($all_data) {
        $sql .= $this->dataSql($table, $fields, $field_num, $all_data); // 生成数据语句
    }
    $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL;
}


4.1、获取表结构信息

// 表结构语句
private function tableSql($table)
{
    $sql = '';
    $sql .= "--" . PHP_EOL;
    $sql .= "-- 表的结构 `" . $table . '`' . PHP_EOL;
    $sql .= "--" . PHP_EOL . PHP_EOL;
    
    $sql .= $this->model->tableStru($table); // 表创建语句
    return $sql;
}


4.2、获取表字段方法

// 获取表字段名
public function getFields($table)
{
    $one_data = parent::one("SELECT * FROM " . $table); // 读取数据
    $fields = array();
    if ($one_data) {
        foreach ($one_data as $key => $value) {
            $fields[] = "`$key`";
        }
    }
    return $fields;
}


4.3、获取字段数量

// 获取表字段数量
public function getFieldNum($table)
{
    return parent::fields($table);
}


4.4、读取全部数据

// 获取全部数据
public function getAll($table)
{
    return parent::all("SELECT * FROM " . $table, MYSQLI_NUM);
}


4.5、生成sql语句:

// 数据语句
private function dataSql($table, $fields, $fieldNnum, $data)
{
    if (! $data)
        return;
    $sql = '';
    $sql .= "--" . PHP_EOL;
    $sql .= "-- 转存表中的数据 `" . $table . "`" . PHP_EOL;
    $sql .= "--" . PHP_EOL;
    $sql .= PHP_EOL;
    
    // 循环每个字段下面的内容
    
    $sql .= "INSERT INTO `" . $table . "` (" . implode(',', $fields) . ") VALUES" . PHP_EOL;
    $brackets = "(";
    foreach ($data as $value) {
        $sql .= $brackets;
        $comma = "";
        for ($i = 0; $i < $fieldNnum; $i ++) {
            $sql .= ($comma . "'" . addslashes(decode_string($value[$i])) . "'");
            $comma = ",";
        }
        $sql .= ")";
        $brackets = "," . PHP_EOL . "(";
    }
    $sql .= ';' . PHP_EOL . PHP_EOL;
    return $sql;
}


5、将生成的sql语句生成文件

// 写入文件
$filename = get_uniqid() . '_' . date('YmdHis') . '_' . $this->dbauth['dbname'] . '.sql';
return $this->writeFile($filename, $sql);


5.1、写入文件方法

// 写入文件
private function writeFile($filename, $content)
{
    $sqlfile = DOC_PATH . STATIC_DIR . '/backup/sql/' . $filename;
    check_file($sqlfile, true);
    if (file_put_contents($sqlfile, $content)) {
        return true;
    }
}



完整代码:

// 备份整个数据库
public function backupDB()
{
    $sql = '';
    $sql .= $this->header(); // 备份文件头部说明
    $sql .= $this->dbSql(); // 数据库创建语句
    
    $tables = $this->model->getTables(); // 获取所有表
    foreach ($tables as $table) { // 表结构及数据
        $sql .= $this->tableSql($table); // 表结构信息
        $fields = $this->model->getFields($table); // 表字段
        $field_num = $this->model->getFieldNum($table); // 字段数量
        $all_data = $this->model->getAll($table); // 读取全部数据
        if ($all_data) {
            $sql .= $this->dataSql($table, $fields, $field_num, $all_data); // 生成数据语句
        }
        $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL;
    }
    // 写入文件
    $filename = get_uniqid() . '_' . date('YmdHis') . '_' . $this->dbauth['dbname'] . '.sql';
    return $this->writeFile($filename, $sql);
}


技术分享

苏南名片

  • 联系人:吴经理
  • 电话:152-1887-1916
  • 邮箱:message@jswusn.com
  • 地址:江苏省苏州市相城区

热门文章

Copyright © 2018-2024 jswusn.com 版权所有

技术支持:苏州网站建设  苏ICP备18036849号