php数据库备份还原类分享


Posted in PHP onMarch 20, 2014
<?php
/**
 * 数据库备份还原类
 * @author xialeistudio<admin@xialeistudio.net>
 * Class DatabaseTool
 */
class DatabaseTool
{
 private $handler;
 private $config = array(
  'host' => 'localhost',
  'port' => 3306,
  'user' => 'root',
  'password' => '',
  'database' => 'test',
  'charset' => 'utf-8',
  'target' => '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连接
  if (!$this->handler instanceof PDO)
  {
   try
   {
    $this->handler = new PDO("mysql:host={$this->config['host']}:{$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);
   }
   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);
   }
   //开始写入
   $this->writeToFile($this->tables, $ddl, $data);
  }
  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++;
  }
  echo file_put_contents($this->config['target'], $str) ? '备份成功!花费时间' . (microtime(true) - $this->begin) . 'ms' : '备份失败!';
 }
 /**
  * 错误信息
  * @return mixed
  */
 public function getError()
 {
  return $this->error;
 }
 public function restore($path = '')
 {
  if (!file_exists($path))
  {
   $this->error('SQL文件不存在!');
   return false;
  }
  else
  {
   $sql = $this->parseSQL($path);
   try
   {
    $this->handler->exec($sql);
    echo '还原成功!花费时间', (microtime(true) - $this->begin) . 'ms';
   }
   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;
 }
}
PHP 相关文章推荐
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
php HTML无刷新提交表单
Apr 05 PHP
smarty的section嵌套循环用法示例
May 28 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP中str_split()函数的用法讲解
Apr 11 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 PHP
thinkphp 获取控制器及控制器方法
Apr 16 PHP
PHP实现微信公众平台音乐点播
Mar 20 #PHP
一个PHP针对数字的加密解密类
Mar 20 #PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 #PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 #PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
Mar 20 #PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 #PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 #PHP
You might like
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
paypal即时到账php实现代码
2010/11/28 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python中range()与xrange()用法分析
2016/09/21 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python读取指定日期邮件的实例
2019/02/01 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
pandas分区间,算频率的实例
2019/07/04 Python
django Admin文档生成器使用详解
2019/07/22 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
村长贪污检举信
2014/04/04 职场文书
新店开张活动方案
2014/08/24 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
学校运动会简讯
2015/07/20 职场文书
岗位聘任协议书
2015/09/21 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
5行Python代码实现一键批量扣图
2021/06/29 Python