ThinkPHP框架实现的MySQL数据库备份功能示例


Posted in PHP onMay 24, 2018

本文实例讲述了ThinkPHP框架实现的MySQL数据库备份功能。分享给大家供大家参考,具体如下:

1、缘由

自从2010年开始试用ThinkPHP以来,的确带来了许多方便。的确给我带来了许多方便。此次应为数据频繁备份需要,而每次远程连接到服务器颇为不便。变萌生了写个ThinkPHP数据库备份SQL生成类的念头。

2、介绍

由于在数据库中有使用触发器。因此也需要一并备份。并且为了插入数据的时候不会受到触发器影响而破坏先前插入的数据,在插入数据之前生成了删除触发器的代码。 本类并不能生成数据表的创建和删除代码,因此在使用中请注意保证两端表结构的一致。

做WEB开发,一直以来,都采用 Navicat For Mysql 将本地数据库同步到服务器上。前些天,突然心血来潮,将本地数据库升级到了 Mysql 5.5版本,再次将数据同步的时候却发生了错误。想起之前写过的 ThinkPHP 实现Mysql数据库备份 只有备份数据的功能,而没有导出表结构的功能。于是想到了升级一下。让其更完整。

本次升级 增加了 备份表结构、视图功能。导出数据增加了类型判断,insert 语句当字段为空的时候会输出 NULL,当为数字 的时候则不会带上 单引号。

<?php
/**
 * 描述:基于ThinkPHP框架的Mysql数据库导出类
 * 日期:2012-07-15
 * 作者:龚辟愚
 */
class DBExport
{
  /**
   * @description 获取当前数据库的所有表名。
   * @static
   * @return array
   */
  static protected function getTables()
  {
    $dbName=C('DB_NAME');
    $result=M()->query("SHOW FULL TABLES FROM `{$dbName}` WHERE Table_Type = 'BASE TABLE'");
    foreach ($result as $v){
      $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
    }
    return $tbArray;
  }
  static protected function getViews()
  {
    $dbName=C('DB_NAME');
    $result=M()->query("SHOW FULL TABLES FROM `{$dbName}` WHERE Table_Type = 'VIEW'");
    foreach ($result as $v){
      $tbArray[]=$v['Tables_in_'.C('DB_NAME')];
    }
    return $tbArray;
  }
  /**
   * @description 导出SQL数据,但不包含表创建代码。
   * @static
   * @return string
   */
  static public function ExportAllData()
  {
    $tables = self::getTables();
    $arrAll = array(
      "SET FOREIGN_KEY_CHECKS=0;",
      self::BuildAllTriggerDropSql(),
      self::BuildTableSql(),
      self::BuildViewSql()
    );
    $tbl = new Model();
    foreach($tables as $table)
    {
      $arrAll[]="\r\nDELETE FROM {$table};";
      /*
      $rs = $tbl->query("SHOW COLUMNS FROM {$table}");
      $arrFields = array();
      foreach ($rs as $k=>&$v){
        $arrFields[] = "`{$v['Field']}`";
      }
      $sqlFields = implode($arrFields,",");
      */
      $rs=$tbl->query("select * from `{$table}`");
      foreach ($rs as $k=>&$v){
        $arrValues = array();
        foreach($v as $key=>$val)
        {
          if(is_numeric($val)){
            $arrValues[]=$val;
          }else if(is_null($val)){
            $arrValues[]='NULL';
          }else{
            $arrValues[]="'".addslashes($val)."'";
          }
        }
        $arrAll[] = "INSERT INTO `{$table}` VALUES (".implode(',',$arrValues).");";
      }
    }
    $arrAll[]=self::BuildTriggerCreateSql();
    return implode("\r\n",$arrAll);
  }
  static protected function BuildTableSql()
  {
    $tables = self::getTables();
    $arrAll = array();
    foreach($tables as &$val){
      $rs = M()->query("SHOW CREATE TABLE `{$val}`");
      $tbSql = preg_replace("#CREATE(.*)\\s+TABLE#","CREATE TABLE",$rs[0]['Create Table']);
      $arrAll[] = "DROP TABLE IF EXISTS `{$rs[0]['Table']}`;\r\n{$tbSql};\r\n";
    }
    return implode("\r\n",$arrAll);
  }
  static protected function BuildViewSql()
  {
    $views = self::getViews();
    $arrAll = array();
    foreach($views as &$val){
      $rs = M()->query("SHOW CREATE VIEW `{$val}`");
      $tbSql = preg_replace("#CREATE(.*)\\s+VIEW#","CREATE VIEW",$rs[0]['Create View']);
      $arrAll[] = "DROP VIEW IF EXISTS `{$rs[0]['View']}`;\r\n{$tbSql};\r\n";
    }
    return implode("\r\n",$arrAll);
  }
  /**
   * @description 如果存在触发器,生成删除代码。原因是:插入数据的时候可能会受到触发器影响。
   * @static
   * @return string
   */
  static public function BuildAllTriggerDropSql()
  {
    $rs = M()->query("show triggers");
    $arrAll = array();
    foreach ($rs as $k=>&$v)
    {
      $arrSql = array(
        'DROP TRIGGER IF EXISTS `',$v['Trigger'],'`;'
      );
      $arrAll[] = implode('',$arrSql);
    }
    return implode("\r\n",$arrAll);
  }
  /**
   * @description 生成所有触发器的创建代码。
   * @static
   * @return string
   */
  static protected function BuildTriggerCreateSql()
  {
    $rs = M()->query("show triggers");
    $arrAll = array();
    foreach ($rs as $k=>&$v)
    {
      $arrSql = array(
        'CREATE TRIGGER `',$v['Trigger'],'` ',$v['Timing'],' ',$v['Event'],' ON `',
        $v['Table'],'` FOR EACH ROW ',$v['Statement'],';'
      );
      $arrAll[] = implode('',$arrSql);
    }
    return implode("\r\n",$arrAll);
  }
}

调用示例:

vendor('DBExport',COMMON_PATH);
header('Content-type: text/plain; charset=UTF-8');
$dbName = C('DB_NAME');
header("Content-Disposition: attachment; filename=\"{$dbName}.sql\"");
echo DBExport::ExportAllData()

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
php 操作调试的方法
Jul 12 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
php实现word转html的方法
Jan 22 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
php加密解密字符串示例
Oct 13 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
php 解析非标准json、非规范json
Apr 01 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 #PHP
PHP实现一维数组与二维数组去重功能示例
May 24 #PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 #PHP
yii2安装详细流程
May 23 #PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 #PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 #PHP
PHP工厂模式简单实现方法示例
May 23 #PHP
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
php经典趣味算法实例代码
2020/01/21 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
javascript操作cookie
2017/01/17 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
Python中实现三目运算的方法
2015/06/21 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
Java的五个基础面试题
2016/02/26 面试题
运动会闭幕式致辞
2015/07/29 职场文书
网吧员工管理制度
2015/08/05 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python