這篇文章主要介紹了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!