网站地图    收藏   

主页 > php专栏 > php应用 >

php数据库备份类程序代码 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] 今天没事收集了两款php数据库备份程序,这里可以完成功能有:1.备份指定数据表、2.打包成zip文件、3.发送到指定邮箱地址,基本功能就这些了.下面看下使用方法,代码如下:?phperror_reporting...

php数据库备份类程序代码

今天没事收集了两款php数据库备份程序,这里可以完成功能有:1.备份指定数据表、2.打包成zip文件、3.发送到指定邮箱地址,基本功能就这些了.

下面看下使用方法,代码如下:

  1. <?php  
  2. error_reporting(0);//消灭万恶的php报警提示  
  3. //设定邮箱  
  4. $options = array('email' => array('email1''email2'),  
  5. 'folder' => './backup/',  
  6. 'mysql' => array('localhost''user''password''db'));  
  7.    
  8. $b = new Backup($options);  
  9.    
  10.   // 提交备份命令  
  11.   if(isset($_POST['backup']))  
  12.   {  
  13.    // 开始备份  
  14.    $b->backupDB();  
  15.   }  
  16.   // 显示备份表  
  17.   $b->outputForm();  
  18. ?> 

具体类实现,代码如下:

  1. <?php  
  2.    
  3. class Backup  
  4. {  
  5. /**  
  6. * @var 用于保存配置参数  
  7. */ 
  8. var $config;  
  9.    
  10. /**  
  11. * @var 用于保存mysql dump的数据  
  12. */ 
  13. var $dump;  
  14.    
  15. /**  
  16. * @var 用于数据库结果数据以及insert指令  
  17. */ 
  18. var $struktur = array();  
  19.    
  20. /**  
  21. * @var 压缩文件名zip  
  22. */ 
  23. var $datei;  
  24.    
  25. /**  
  26. * 结构函数  
  27. * 连接数据库  
  28. * @return  
  29. */ 
  30. public function Backup($options)  
  31. {  
  32. // 从形参中读取配置  
  33. foreach($options AS $name => $value)  
  34. {  
  35. $this->config[$name] = $value;  
  36. }  
  37.    
  38. // 连接数据库  
  39. mysql_connect($this->config['mysql'][0], $this->config['mysql'][1],  
  40. $this->config['mysql'][2]) or die(mysql_error());  
  41. mysql_select_db($this->config['mysql'][3]) or die(mysql_error());  
  42. }  
  43.    
  44. /**  
  45. * 执行备份数据库流程的函数  
  46. * @return  
  47. */ 
  48. public function backupDB()  
  49. {  
  50. // 开始备份的命令  
  51. if(isset($_POST['backup']))  
  52. {  
  53. // 检测是否选择了数据表  
  54. if(emptyempty($_POST['table']))  
  55. {  
  56. die("请选择一个数据表。");  
  57. }  
  58.    
  59. /** 开始备份 **/ 
  60. $tables = array();  
  61. $insert = array();  
  62. $sql_statement = '';  
  63.    
  64. // 锁定需要备份的数据库,防止读脏数据  
  65. foreach($_POST['table'] AS $table)  
  66. {  
  67. mysql_query("LOCK TABLE $table WRITE");  
  68.    
  69. // 获取数据库结构  
  70. $res = mysql_query('SHOW CREATE TABLE '.$table.'');  
  71. $createtable = mysql_result($res, 0, 1);  
  72. $str = "nn".$createtable."nn";  
  73.    
  74. array_push($tables$str);  
  75.    
  76. // 查询数据表中的所有数据行  
  77. $sql = 'SELECT * FROM '.$table;  
  78. $query = mysql_query($sqlor die(mysql_error());  
  79. $feld_anzahl = mysql_num_fields($query);  
  80.    
  81. $sql_statement = '--  
  82. -- Data Table `$table`  
  83. --  
  84. ';  
  85.    
  86. // 开始读数据,并将其转换为insert命令  
  87. while($ds = mysql_fetch_object($query)){  
  88. $sql_statement .= 'INSERT INTO `'.$table.'` (';  
  89.    
  90. for ($i = 0;$i <$feld_anzahl;$i++){  
  91. if ($i ==$feld_anzahl-1){  
  92. $sql_statement .= mysql_field_name($query,$i);  
  93. else {  
  94. $sql_statement .= mysql_field_name($query,$i).', ';  
  95. }  
  96. }  
  97.    
  98. $sql_statement .= ') VALUES (';  
  99.    
  100. for ($i = 0;$i <$feld_anzahl;$i++){  
  101. $name = mysql_field_name($query,$i);  
  102. if (emptyempty($ds->$name)){  
  103. $ds->$name = 'NULL';  
  104. }  
  105. if ($i ==$feld_anzahl-1){  
  106. $sql_statement .= '"'.$ds->$name.'"';  
  107. else {  
  108. $sql_statement .= '"'.$ds->$name.'", ';  
  109. }  
  110. }  
  111. $sql_statement .= ");n";  
  112. }  
  113.    
  114. // 将insert数据放在数组中,去重  
  115. if(!in_array($sql_statement$insert))  
  116. {  
  117. array_push($insert$sql_statement);  
  118. unset($sql_statement);  
  119. }  
  120.    
  121. unset($sql_statement);  
  122.    
  123. }  
  124.    
  125. // 将数据库结构与insert命令放在一起啦  
  126. $this->struktur = array_combine($tables$insert);  
  127.    
  128. // 执行dump函数  
  129. $this->createDUMP($this->struktur);  
  130.    
  131. // 生成zip压缩包  
  132. $this->createZIP();  
  133.    
  134. /** 备份结束 **/ 
  135.    
  136. // 发一封邮件到指定邮箱,附件包含sql备份,如果你设置了的话^_^  
  137. if(isset($this->config['email']) && !emptyempty($this->config['email']))  
  138. {  
  139. $this->sendEmail();  
  140. }  
  141.    
  142. // output  
  143. echo '<h3 style="color:green;">备份完成啦</h3><a href="'.  
  144. $this->datei.'">下载备份</a>  
  145. <br />  
  146. <br />';  
  147. }  
  148. }  
  149.    
  150. /**  
  151. * 发送邮件函数  
  152. * @return  
  153. */ 
  154. protected function sendEmail()  
  155. {  
  156. // 读取邮箱地址  
  157. foreach($this->config['email'] AS $email)  
  158. {  
  159. $to = $email;  
  160.    
  161. $from = $this->config['email'][0];  
  162.    
  163. $message_body = "本邮件中包含的zip压缩包为数据库备份";  
  164.    
  165. $msep = strtoupper (md5 (uniqid (time ())));  
  166.    
  167. // 设置email头  
  168. $header =  
  169. "From: $fromrn" .  
  170. "MIME-Version: 1.0rn" .  
  171. "Content-Type: multipart/mixed; boundary=".$msep."rnrn" .  
  172. "--$mseprn" .  
  173. "Content-Type: text/plainrn" .  
  174. "Content-Transfer-Encoding: 8bitrnrn" .  
  175. $message_body . "rn";  
  176.    
  177. // 文件名  
  178. $dateiname = $this->datei;  
  179.    
  180. // 压缩包大小  
  181. $dateigroesse = filesize ($dateiname);  
  182.    
  183. // 读取压缩包  
  184. $f = fopen ($dateiname"r");  
  185. // 保存到附件  
  186. $attached_file = fread ($f$dateigroesse);  
  187. // 关闭压缩包  
  188. fclose ($f);  
  189. // 建立一个附件  
  190. $attachment = chunk_split (base64_encode ($attached_file));  
  191.    
  192. // 设置附件头  
  193. $header .=  
  194. "--" . $msep . "rn" .  
  195. "Content-Type: application/zip; name='Backup'rn" .  
  196. "Content-Transfer-Encoding: base64rn" .  
  197. "Content-Disposition: attachment; filename='Backup.zip'rn" .  
  198. "Content-Description: Mysql Datenbank Backup im Anhangrnrn" .  
  199. $attachment . "rn";  
  200.    
  201. // 标记附件结束未知  
  202. $header .= "--$msep--";  
  203.    
  204. // 邮件标题  
  205. $subject = "数据库备份";  
  206.    
  207. // 发送邮件需要开启php相应支持哦^^  
  208. if(mail($to$subject''$header) == FALSE)  
  209. {  
  210. die("无法发送邮件,请检查邮箱地址");  
  211. }  
  212.    
  213. echo "<p><small>邮件发送成功</small></p>";  
  214. }  
  215. }  
  216.    
  217. /**  
  218. * 建立数据库备份的压缩包并保存到服务器指定目录中  
  219. * @return  
  220. */ 
  221. protected function createZIP()  
  222. {  
  223.    
  224. // 文件夹权限要够  
  225. chmod($this->config['folder'], 0777);  
  226.    
  227. // 建立压缩包  
  228. $zip = new ZipArchive();  
  229. // 设置压缩包文件名  
  230. $this->datei = $this->config['folder'].$this->config['mysql'][3]."_" 
  231. .date("j_F_Y_g_i_a").".zip";  
  232.    
  233. // 看看压缩包能不能打开  
  234. if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {  
  235. exit("无法打开 <".$this->datei.">n");  
  236. }  
  237.    
  238. // 把dump出来的数据放到压缩包里  
  239. $zip->addFromString("dump.sql"$this->dump);  
  240. // 关闭压缩包  
  241. $zip->close();  
  242.    
  243. // 看看压缩包有没有生成  
  244. if(!file_exists($this->datei))  
  245. {  
  246. die("无法生成压缩包");  
  247. }  
  248.    
  249. echo "<p><small>数据库备份压缩包成功生成</small></p>";  
  250. }  
  251.    
  252. /**  
  253. * mysql dump函数  
  254. * @param object $dump  
  255. * @return  
  256. */ 
  257. protected function createDUMP($dump)  
  258. {  
  259. $date = date("F j, Y, g:i a");  
  260.    
  261. $header = <<<HEADER  
  262.         -- SQL Dump  
  263. --  
  264. -- Host: {$_SERVER['HTTP_HOST']}  
  265. -- Erstellungszeit: {$date}  
  266.    
  267. --  
  268. -- Datenbank: `{$this->config['mysql'][3]}`  
  269. --  
  270.    
  271. -- --------------------------------------------------------  
  272.    
  273. HEADER;  
  274. foreach($dump AS $name => $value)  
  275. {  
  276. $sql .= $name.$value;  
  277. }  
  278. $this->dump = $header.$sql;  
  279. }  
  280.    
  281. /**  
  282. * 生成选择数据表的界面函数  
  283. * @return  
  284. */ 
  285. public function outputForm()  
  286. {  
  287. // 选择全部  
  288. $result = mysql_list_tables($this->config['mysql'][3]);  
  289.    
  290. $buffer = '  
  291. <fieldset>  
  292. <legend>选择需要备份的数据表</legend>  
  293. <form method="post" action="">  
  294. <select name="table[]" multiple="multiple" size="30">';  
  295. while($row = mysql_fetch_row($result))  
  296. {  
  297. $buffer .= '<option value="'.$row[0].'">'.$row[0].'</option>';  
  298. }  
  299. $buffer .= '</select>  
  300. <br /><br />  
  301. <input type="submit" name="backup" value="备份选定数据表" />  
  302. </form>  
  303. </fieldset>';  
  304.    
  305. echo $buffer;  
  306. }  
  307. }  
  308.    
  309. ?> 

通用数据库备份类,代码如下:

  1. <?php 
  2. /*数据库备份:NOTICE:此类要添加数据库连接才能正常工作*/ 
  3. Class Back_up_databaseextendsdbstuff{ 
  4. //类开始 
  5. var $HOST
  6. var $USERNAME
  7. var $PASSWORD
  8. var $DATABASE
  9. function Back_up_database($host,$username,$password,$database){ 
  10. //初始化数据库连接 
  11. $this->HOST=$host
  12. $this->USERNAME=$username
  13. $this->ASSWORD=$password
  14. $this->DATABASE=$database
  15. $Connection=$this->connect($this->HOST,$this->USERNAME,$this->ASSWORD,$this->DATABASE,$pconnect); 
  16. $this->Connection=$Connection
  17. //取得数据库中的表 
  18. function get_table_name($database){ 
  19. $this->Connection; 
  20. $result=mysql_list_tables($database); 
  21. $i=0; 
  22. while($i<mysql_num_rows($result)){ 
  23. $tb_name[$i]=mysql_tablename($result,$i); 
  24. $table_name.=$tb_name[$i].","
  25. $i++; 
  26. $this->table_name=substr($table_name,0,-1); 
  27. return$this->table_name; 
  28. //取得每个表中的FIELDS和属性并生成CREATETABLE语句 
  29. function get_table_fields($table_name){ 
  30. $this->Connection; 
  31. $createtable=dbstuff::query("SHOWCREATETABLE$table_name"); 
  32. $create=dbstuff::fetch_row($createtable); 
  33. $tabledump.="DROPTABLEIFEXISTS$table_name;\n"
  34. $tabledump.=$create[1].";\n\n"
  35. $this->$table_name=$tabledump
  36. return$this->$table_name
  37. //取得表中的数据并生成ISERTINTO语句 
  38. function get_insert($table_insert_name){ 
  39. $this->Connection; 
  40. $rows=dbstuff::query("SELECT*FROM$table_insert_name"); 
  41. $numfields=dbstuff::num_fields($rows); 
  42. $numrows=dbstuff::num_rows($rows); 
  43. while($row=dbstuff::fetch_row($rows)){ 
  44. $comma=""
  45. $tabledump.="INSERTINTO$table_insert_nameVALUES("
  46. for($i=0;$i<$numfields;$i++){ 
  47. $tabledump.=$comma."'".mysql_escape_string($row[$i])."'"
  48. $comma=","
  49. $tabledump.=");\n"
  50. $this->tabledump=$tabledump
  51. return$this->tabledump; 
  52. //获取所有数据并连接成新的字符串并将它写入文件中.sql 
  53. function get_string($database_name,$file_path_name){ 
  54. $time=date("Y-m-dH:j"); 
  55. $date_time=date("YmdHis"); 
  56. $file_path_name=$file_path_name.$date_time.".sql"
  57. $version="Antsent_Web_StudioDatabaseBackUpV1.01"
  58. $idstring='#Identify:'.base64_encode("$time,$version")."\n"
  59. $head_info="$idstring"
  60. "#\n"
  61. "#Antsnet_Web!TheBasicClassOfBackUpDataBase\n"
  62. "#Version:AntsnetWeb!$version\n"
  63. "#Timetime\n"
  64. "#Type:ClassOfBackUpDataBase\n"
  65. "#Antsnet_Web_Studio!Home:http://www.111cn.net \n"
  66. "#PleasevisitourwebsitefornewestinfomationaboutAntsnet_Web_Studio!\n"
  67. "#--------------------------------------------------------\n\n\n"
  68. $table_name=$this->get_table_name($database_name); 
  69. $array_table=explode(",",$table_name); 
  70. for($i=0;$i<count($array_table);$i++){ 
  71. $table_string.=$this->get_table_fields($array_table[$i]); 
  72. $table_insert.=$this->get_insert($array_table[$i]); 
  73. $count_string=$head_info.$table_string.$table_insert
  74. //return$count_string; 
  75. $write_status=$this->write_file($file_path_name,$count_string); 
  76. return$write_status;//开源代码phpfensi.com 
  77. //写入一个文件 
  78. function write_file($file_path,$file_contents){ 
  79. if(@!$fp=fopen($file_path,'w')){ 
  80. $status="<fontcolor=\"red\">ThisFileCouldNotOpenOrRead.</font>"
  81. }else
  82. flock($fp,3); 
  83. fwrite($fp,$file_contents); 
  84. fclose($fp); 
  85. window.google_render_ad(); 
  86. ?>

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论