ThinkPHP框架實(shí)現(xiàn)的MySQL數(shù)據(jù)庫(kù)備份功能示例
本文實(shí)例講述了ThinkPHP框架實(shí)現(xiàn)的MySQL數(shù)據(jù)庫(kù)備份功能。分享給大家供大家參考,具體如下:
1、緣由
自從2010年開(kāi)始試用ThinkPHP以來(lái),的確帶來(lái)了許多方便。的確給我?guī)?lái)了許多方便。此次應(yīng)為數(shù)據(jù)頻繁備份需要,而每次遠(yuǎn)程連接到服務(wù)器頗為不便。變萌生了寫(xiě)個(gè)ThinkPHP數(shù)據(jù)庫(kù)備份SQL生成類(lèi)的念頭。
2、介紹
由于在數(shù)據(jù)庫(kù)中有使用觸發(fā)器。因此也需要一并備份。并且為了插入數(shù)據(jù)的時(shí)候不會(huì)受到觸發(fā)器影響而破壞先前插入的數(shù)據(jù),在插入數(shù)據(jù)之前生成了刪除觸發(fā)器的代碼。 本類(lèi)并不能生成數(shù)據(jù)表的創(chuàng)建和刪除代碼,因此在使用中請(qǐng)注意保證兩端表結(jié)構(gòu)的一致。
做WEB開(kāi)發(fā),一直以來(lái),都采用 Navicat For Mysql 將本地?cái)?shù)據(jù)庫(kù)同步到服務(wù)器上。前些天,突然心血來(lái)潮,將本地?cái)?shù)據(jù)庫(kù)升級(jí)到了 Mysql 5.5版本,再次將數(shù)據(jù)同步的時(shí)候卻發(fā)生了錯(cuò)誤。想起之前寫(xiě)過(guò)的 ThinkPHP 實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)備份 只有備份數(shù)據(jù)的功能,而沒(méi)有導(dǎo)出表結(jié)構(gòu)的功能。于是想到了升級(jí)一下。讓其更完整。
本次升級(jí) 增加了 備份表結(jié)構(gòu)、視圖功能。導(dǎo)出數(shù)據(jù)增加了類(lèi)型判斷,insert 語(yǔ)句當(dāng)字段為空的時(shí)候會(huì)輸出 NULL,當(dāng)為數(shù)字 的時(shí)候則不會(huì)帶上 單引號(hào)。
<?php /** * 描述:基于ThinkPHP框架的Mysql數(shù)據(jù)庫(kù)導(dǎo)出類(lèi) * 日期:2012-07-15 * 作者:龔辟愚 */ class DBExport { /** * @description 獲取當(dāng)前數(shù)據(jù)庫(kù)的所有表名。 * @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 導(dǎo)出SQL數(shù)據(jù),但不包含表創(chuàng)建代碼。 * @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 如果存在觸發(fā)器,生成刪除代碼。原因是:插入數(shù)據(jù)的時(shí)候可能會(huì)受到觸發(fā)器影響。 * @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 生成所有觸發(fā)器的創(chuàng)建代碼。 * @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); } }
調(diào)用示例:
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()
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《ThinkPHP入門(mén)教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門(mén)教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門(mén)教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
- 解決php用mysql方式連接數(shù)據(jù)庫(kù)出現(xiàn)Deprecated報(bào)錯(cuò)問(wèn)題
- php連接mysql數(shù)據(jù)庫(kù)最簡(jiǎn)單的實(shí)現(xiàn)方法
- PHP使用PDO創(chuàng)建MySQL數(shù)據(jù)庫(kù)、表及插入多條數(shù)據(jù)操作示例
- 完美解決phpstudy安裝后mysql無(wú)法啟動(dòng)(無(wú)需刪除原數(shù)據(jù)庫(kù),無(wú)需更改任何配置,無(wú)需更改端口)直接共存
- PHP封裝mysqli基于面向?qū)ο蟮膍ysql數(shù)據(jù)庫(kù)操作類(lèi)與用法示例
- PHP基于pdo的數(shù)據(jù)庫(kù)操作類(lèi)【可支持mysql、sqlserver及oracle】
- PHP連接MySQL數(shù)據(jù)庫(kù)并以json格式輸出
- PHP連接MYSQL數(shù)據(jù)庫(kù)的3種常用方法
- PHP連接MySQL數(shù)據(jù)庫(kù)操作代碼實(shí)例解析
相關(guān)文章
Zend Framework教程之資源(Resources)用法實(shí)例詳解
這篇文章主要介紹了Zend Framework教程之資源(Resources)用法,結(jié)合實(shí)例形式詳細(xì)分析了Resources的功能,定義,使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-03-03PHP使用SWOOLE擴(kuò)展實(shí)現(xiàn)定時(shí)同步 MySQL 數(shù)據(jù)
本文給大家介紹的是一次比較特殊的任務(wù),我們使用PHP SWOOLE 做一個(gè)異步的定時(shí)任務(wù)系統(tǒng),具體如何來(lái)實(shí)現(xiàn)的呢,接下來(lái)來(lái)我們好好看下吧2017-04-04Yii Framework框架中事件和行為的區(qū)別及應(yīng)用實(shí)例分析
這篇文章主要介紹了Yii Framework框架中事件和行為的區(qū)別及應(yīng)用,結(jié)合實(shí)例形式分析了Yii Framework框架中事件和行為的相關(guān)概念、原理、區(qū)別及應(yīng)用操作技巧,需要的朋友可以參考下2020-04-04ThinkPHP訪問(wèn)不存在的模塊跳轉(zhuǎn)到404頁(yè)面的方法
這篇文章主要介紹了ThinkPHP訪問(wèn)不存在的模塊跳轉(zhuǎn)到404頁(yè)面的方法,需要的朋友可以參考下2014-06-06Laravel中利用隊(duì)列發(fā)送郵件的方法示例
在日常利用laravel開(kāi)發(fā)博客中,經(jīng)常遇到發(fā)送郵件的功能,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以下面這篇文章主要給大家介紹了關(guān)于Laravel中隊(duì)列發(fā)送郵件的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08ThinkPHP模板判斷輸出Defined標(biāo)簽用法詳解
這篇文章主要介紹了ThinkPHP模板判斷輸出Defined標(biāo)簽用法詳解,需要的朋友可以參考下2014-06-06laravel admin實(shí)現(xiàn)分類(lèi)樹(shù)/模型樹(shù)的示例代碼
這篇文章主要介紹了laravel admin實(shí)現(xiàn)分類(lèi)樹(shù)/模型樹(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06