• 技术文章 >后端开发 >php教程

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

    jacklovejacklove2018-06-22 16:01:34原创1285
    这篇文章主要介绍了ThinkPHP框架实现的MySQL数据库备份功能,结合实例形式分析了thinkPHP导出mysql数据库相关操作实现与使用技巧,需要的朋友可以参考下

    本文实例讲述了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()

    您可能感兴趣的文章:

    通过PHP实现微信小程序人脸识别刷脸登录功能

    PHP实现防止表单重复提交功能【基于token验证】

    tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例

    以上就是ThinkPHP框架实现的MySQL数据库备份功能示例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:通过PHP实现微信小程序人脸识别刷脸登录功能 下一篇:CI框架(CodeIgniter)实现的导入、导出数据操作示例
    PHP编程就业班

    相关文章推荐

    • 或者用到的php代码 • 求指导学习php思路,该怎么解决 • dede首页生成有关问题,附带一个特效有关问题 • 求共享dedecms二次开发视频• PHP提交数据到mysql很奇怪的问题??????????????????????

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网