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中一些可能会被忽略的问题
Jun 21 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
PHP实现多图片上传类实例
Jul 26 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
各种快递查询--Api接口
Apr 26 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 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原生函数一定好吗?
2014/12/08 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
详解Django中的权限和组以及消息
2015/07/23 Python
python万年历实现代码 含运行结果
2017/05/20 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python线程同步的实现代码
2018/10/03 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
开水果连锁店创业计划书
2013/12/29 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
大学生励志演讲稿
2014/04/25 职场文书
学校消防安全责任书
2014/07/23 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
驻村工作简报
2015/07/20 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript