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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
php中http_build_query 的一个问题
Mar 25 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
ThinkPHP内置jsonRPC的缺陷分析
Dec 18 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 PHP
PHP PDOStatement::getAttribute讲解
Feb 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
php json_encode奇怪问题说明
2011/09/27 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python实现截屏的函数
2015/07/26 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
函授毕业生自我鉴定
2013/11/06 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
篮球拉拉队口号
2015/12/25 职场文书
银行服务理念口号
2015/12/25 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL
Python列表的索引与切片
2022/04/07 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers