参考文档:
https://blog.csdn.net/qq_42455095/article/details/84313754#commentBox
https://blog.csdn.net/qq_42249896/article/details/85238523
https://blog.csdn.net/cplvfx/article/details/86494487
自己整理了一个文档~~~
效果图:
一、下载类文件
https://github.com/joytom/db_backup
按照下图存放类文件
我对Baksql.php文件进行了一点改动,代码如下:
主要修改的是get_dbdata方法,我也做了标记
<?php
/**
* 备份数据库的扩展类
*/
namespace org;
class Baksql {
private $config=[];
private $handler;
private $tables = array();//需要备份的表
private $begin; //开始时间
private $error;//错误信息
public function __construct($config) {
/记住创建这个存放备份文件目录,不然会报错
$config['path']=ROOT_PATH . 'public' . DS .'static'. DS .'data/'; //默认目录
$config["sqlbakname"]=date("YmdHis",time()).".sql";//默认保存文件
$this->config = $config;
$this->begin = microtime(true);
header("Content-type: text/html;charset=utf-8");
$this->connect();
}
//首次进行pdo连接
private function connect() {
try{
$this->handler =new \PDO("{$this->config['type']}:host={$this->config['hostname']};port={$this->config['hostport']};dbname={$this->config['database']};",
$this->config['username'],
$this->config['password'],
array(
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES {$this->config['charset']};",
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC
));
}catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
}
/**
* 查询
* @param string $sql
* @return mixed
*/
private function query($sql = '')
{
$stmt = $this->handler->query($sql);
$stmt->setFetchMode(\PDO::FETCH_NUM);
$list = $stmt->fetchAll();
return $list;
}
/**
* 获取全部表
* @param string $dbName
* @return array
*/
private function get_dbname($dbName = '*') {
$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 get_dbhead($table = '')
{
$sql = "SHOW CREATE TABLE `{$table}`";
$ddl = $this->query($sql)[0][1] . ';';
return $ddl;
}
/**
* 获取表数据
* @param string $table
* @return mixed
*/
private function get_dbdata($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 = '';
/我的数据库中有 上传图片的路径带有 \特殊字符 备份时消失了
/数据库时候路径中的反斜杠会丢失,所以导出的时候要再给他加一个反斜杠///
$value=array_map('addslashes', $value);//给预定义字符加反斜杠
//原来的代码
// foreach ($value as $v)
// {
// $dataSql .= "'{$v}',";
// }
/1.程序生成的代码,字段没有字符集;主要出现在varchar类型
/2.程序生成的代码,int字段的数据被加单引号''//
//修改
/**
* 2019-07-25 xiaoxia 修改后
* */
//cp循环次数
$cp_loop_time=0;
foreach ($value as $v)
{
if(strpos($list[$cp_loop_time][1],'int') !== false || strpos($list[$cp_loop_time][1],'double') !== false )
{
if($v==null)
{
$dataSql .= "NULL,";
}
else{
$dataSql .= "{$v},"