研究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); }