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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
PHPCMS的使用小结
Sep 20 PHP
php的memcached客户端memcached
Jun 14 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
Yii快速入门经典教程
Dec 28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 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
linux iconv方法的使用
2011/10/01 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
numpy中索引和切片详解
2017/12/15 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
Pytorch释放显存占用方式
2020/01/13 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
什么是接口(Interface)?
2013/02/01 面试题
学生喝酒检讨书
2014/02/06 职场文书
小学生元旦感言
2014/02/26 职场文书
班级寄语大全
2014/04/10 职场文书
组工干部对照检查材料
2014/08/25 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
nginx之内存池的实现
2022/06/28 Servers
JavaScript实现简单的音乐播放器
2022/08/14 Javascript
python缺失值填充方法示例代码
2022/12/24 Python