ThinkPHP框架实现的MySQL数据库备份功能示例
本文实例讲述了ThinkPHP框架实现的MySQL数据库备份功能。分享给大家供大家参考,具体如下:
1、缘由
自从2010年开始试用ThinkPHP以来,的确带来了许多方便。的确给我带来了许多方便。此次应为数据频繁备份需要,而每次远程连接到服务器颇为不便。变萌生了写个ThinkPHP数据库备份SQL生成类的念头。
2、介绍
由于在数据库中有使用触发器。因此也需要一并备份。并且为了插入数据的时候不会受到触发器影响而破坏先前插入的数据,在插入数据之前生成了删除触发器的代码。本类并不能生成数据表的创建和删除代码,因此在使用中请注意保证两端表结构的一致。
做WEB开发,一直以来,都采用NavicatForMysql将本地数据库同步到服务器上。前些天,突然心血来潮,将本地数据库升级到了Mysql5.5版本,再次将数据同步的时候却发生了错误。想起之前写过的ThinkPHP实现Mysql数据库备份只有备份数据的功能,而没有导出表结构的功能。于是想到了升级一下。让其更完整。
本次升级增加了备份表结构、视图功能。导出数据增加了类型判断,insert语句当字段为空的时候会输出NULL,当为数字的时候则不会带上单引号。
query("SHOWFULLTABLESFROM`{$dbName}`WHERETable_Type='BASETABLE'"); foreach($resultas$v){ $tbArray[]=$v['Tables_in_'.C('DB_NAME')]; } return$tbArray; } staticprotectedfunctiongetViews() { $dbName=C('DB_NAME'); $result=M()->query("SHOWFULLTABLESFROM`{$dbName}`WHERETable_Type='VIEW'"); foreach($resultas$v){ $tbArray[]=$v['Tables_in_'.C('DB_NAME')]; } return$tbArray; } /** *@description导出SQL数据,但不包含表创建代码。 *@static *@returnstring */ staticpublicfunctionExportAllData() { $tables=self::getTables(); $arrAll=array( "SETFOREIGN_KEY_CHECKS=0;", self::BuildAllTriggerDropSql(), self::BuildTableSql(), self::BuildViewSql() ); $tbl=newModel(); foreach($tablesas$table) { $arrAll[]="\r\nDELETEFROM{$table};"; /* $rs=$tbl->query("SHOWCOLUMNSFROM{$table}"); $arrFields=array(); foreach($rsas$k=>&$v){ $arrFields[]="`{$v['Field']}`"; } $sqlFields=implode($arrFields,","); */ $rs=$tbl->query("select*from`{$table}`"); foreach($rsas$k=>&$v){ $arrValues=array(); foreach($vas$key=>$val) { if(is_numeric($val)){ $arrValues[]=$val; }elseif(is_null($val)){ $arrValues[]='NULL'; }else{ $arrValues[]="'".addslashes($val)."'"; } } $arrAll[]="INSERTINTO`{$table}`VALUES(".implode(',',$arrValues).");"; } } $arrAll[]=self::BuildTriggerCreateSql(); returnimplode("\r\n",$arrAll); } staticprotectedfunctionBuildTableSql() { $tables=self::getTables(); $arrAll=array(); foreach($tablesas&$val){ $rs=M()->query("SHOWCREATETABLE`{$val}`"); $tbSql=preg_replace("#CREATE(.*)\\s+TABLE#","CREATETABLE",$rs[0]['CreateTable']); $arrAll[]="DROPTABLEIFEXISTS`{$rs[0]['Table']}`;\r\n{$tbSql};\r\n"; } returnimplode("\r\n",$arrAll); } staticprotectedfunctionBuildViewSql() { $views=self::getViews(); $arrAll=array(); foreach($viewsas&$val){ $rs=M()->query("SHOWCREATEVIEW`{$val}`"); $tbSql=preg_replace("#CREATE(.*)\\s+VIEW#","CREATEVIEW",$rs[0]['CreateView']); $arrAll[]="DROPVIEWIFEXISTS`{$rs[0]['View']}`;\r\n{$tbSql};\r\n"; } returnimplode("\r\n",$arrAll); } /** *@description如果存在触发器,生成删除代码。原因是:插入数据的时候可能会受到触发器影响。 *@static *@returnstring */ staticpublicfunctionBuildAllTriggerDropSql() { $rs=M()->query("showtriggers"); $arrAll=array(); foreach($rsas$k=>&$v) { $arrSql=array( 'DROPTRIGGERIFEXISTS`',$v['Trigger'],'`;' ); $arrAll[]=implode('',$arrSql); } returnimplode("\r\n",$arrAll); } /** *@description生成所有触发器的创建代码。 *@static *@returnstring */ staticprotectedfunctionBuildTriggerCreateSql() { $rs=M()->query("showtriggers"); $arrAll=array(); foreach($rsas$k=>&$v) { $arrSql=array( 'CREATETRIGGER`',$v['Trigger'],'`',$v['Timing'],'',$v['Event'],'ON`', $v['Table'],'`FOREACHROW',$v['Statement'],';' ); $arrAll[]=implode('',$arrSql); } returnimplode("\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\""); echoDBExport::ExportAllData()
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《ZendFrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。