ThinkPHP架構實現的MySQLDatabase Backup功能

來源:互聯網
上載者:User
這篇文章主要介紹了ThinkPHP架構實現的MySQLDatabase Backup功能,結合執行個體形式分析了thinkPHP匯出mysql資料庫相關操作實現與提示,需要的朋友可以參考下

本文執行個體講述了ThinkPHP架構實現的MySQLDatabase Backup功能。分享給大家供大家參考,具體如下:

1、緣由

自從2010年開始試用ThinkPHP以來,的確帶來了許多方便。的確給我帶來了許多方便。此次應為資料頻繁備份需要,而每次遠端連線到伺服器頗為不便。變萌生了寫個ThinkPHPDatabase BackupSQL產生類的念頭。

2、介紹

由於在資料庫中有使用觸發器。因此也需要一併備份。並且為了插入資料的時候不會受到觸發器影響而破壞先前插入的資料,在插入資料之前產生了刪除觸發器的代碼。 本類並不能產生資料表的建立和刪除代碼,因此在使用中請注意保證兩端表結構的一致。

做WEB開發,一直以來,都採用 Navicat For Mysql 將本機資料庫同步到伺服器上。前些天,突然心血來潮,將本機資料庫升級到了 Mysql 5.5版本,再次將資料同步的時候卻發生了錯誤。想起之前寫過的 ThinkPHP 實現MysqlDatabase Backup 只有備份資料的功能,而沒有匯出表結構的功能。於是想到了升級一下。讓其更完整。

本次升級 增加了 備份表結構、視圖功能。匯出資料增加了類型判斷,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()

以上就是本篇文章的全部內容了,感謝大家閱讀。更多請關注topic.alibabacloud.com!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.