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







