今天沒事收集了兩款php數據庫備份程序,這里可以完成功能有:1.備份指定數據表、2.打包成zip文件、3.發送到指定郵箱地址,基本功能就這些了.
下面看下使用方法,代碼如下:
- <?php
- error_reporting(0);//消滅萬惡的php報警提示
- //設定郵箱
- $options = array('email' => array('email1', 'email2'),
- 'folder' => './backup/',
- 'mysql' => array('localhost', 'user', 'password', 'db'));
- $b = new Backup($options);
- // 提交備份命令
- if(isset($_POST['backup']))
- {
- // 開始備份
- $b->backupDB();
- }
- // 顯示備份表
- $b->outputForm();
- ?>
具體類實現,代碼如下:
- <?php
- class Backup
- {
- /**
- * @var 用于保存配置參數
- */
- var $config;
- /**
- * @var 用于保存mysql dump的數據
- */
- var $dump;
- /**
- * @var 用于數據庫結果數據以及insert指令
- */
- var $struktur = array();
- /**
- * @var 壓縮文件名zip
- */
- var $datei;
- /**
- * 結構函數
- * 連接數據庫
- * @return
- */
- public function Backup($options)
- {
- // 從形參中讀取配置
- foreach($options AS $name => $value)
- {
- $this->config[$name] = $value;
- }
- // 連接數據庫
- mysql_connect($this->config['mysql'][0], $this->config['mysql'][1],
- $this->config['mysql'][2]) or die(mysql_error());
- mysql_select_db($this->config['mysql'][3]) or die(mysql_error());
- }
- /**
- * 執行備份數據庫流程的函數
- * @return
- */
- public function backupDB()
- {
- // 開始備份的命令
- if(isset($_POST['backup']))
- {
- // 檢測是否選擇了數據表
- if(emptyempty($_POST['table']))
- {
- die("請選擇一個數據表。");
- }
- /** 開始備份 **/
- $tables = array();
- $insert = array();
- $sql_statement = '';
- // 鎖定需要備份的數據庫,防止讀臟數據
- foreach($_POST['table'] AS $table)
- {
- mysql_query("LOCK TABLE $table WRITE");
- // 獲取數據庫結構
- $res = mysql_query('SHOW CREATE TABLE '.$table.'');
- $createtable = mysql_result($res, 0, 1);
- $str = "nn".$createtable."nn";
- array_push($tables, $str);
- // 查詢數據表中的所有數據行
- $sql = 'SELECT * FROM '.$table;
- $query = mysql_query($sql) or die(mysql_error());
- $feld_anzahl = mysql_num_fields($query);
- $sql_statement = '--
- -- Data Table `$table`
- --
- ';
- // 開始讀數據,并將其轉換為insert命令
- while($ds = mysql_fetch_object($query)){
- $sql_statement .= 'INSERT INTO `'.$table.'` (';
- for ($i = 0;$i <$feld_anzahl;$i++){
- if ($i ==$feld_anzahl-1){
- $sql_statement .= mysql_field_name($query,$i);
- } else {
- $sql_statement .= mysql_field_name($query,$i).', ';
- }
- }
- $sql_statement .= ') VALUES (';
- for ($i = 0;$i <$feld_anzahl;$i++){
- $name = mysql_field_name($query,$i);
- if (emptyempty($ds->$name)){
- $ds->$name = 'NULL';
- }
- if ($i ==$feld_anzahl-1){
- $sql_statement .= '"'.$ds->$name.'"';
- } else {
- $sql_statement .= '"'.$ds->$name.'", ';
- }
- }
- $sql_statement .= ");n";
- }
- // 將insert數據放在數組中,去重
- if(!in_array($sql_statement, $insert))
- {
- array_push($insert, $sql_statement);
- unset($sql_statement);
- }
- unset($sql_statement);
- }
- // 將數據庫結構與insert命令放在一起啦
- $this->struktur = array_combine($tables, $insert);
- // 執行dump函數
- $this->createDUMP($this->struktur);
- // 生成zip壓縮包
- $this->createZIP();
- /** 備份結束 **/
- // 發一封郵件到指定郵箱,附件包含sql備份,如果你設置了的話^_^
- if(isset($this->config['email']) && !emptyempty($this->config['email']))
- {
- $this->sendEmail();
- }
- // output
- echo '<h3 style="color:green;">備份完成啦</h3><a href="'.
- $this->datei.'">下載備份</a>
- <br />
- <br />';
- }
- }
- /**
- * 發送郵件函數
- * @return
- */
- protected function sendEmail()
- {
- // 讀取郵箱地址
- foreach($this->config['email'] AS $email)
- {
- $to = $email;
- $from = $this->config['email'][0];
- $message_body = "本郵件中包含的zip壓縮包為數據庫備份";
- $msep = strtoupper (md5 (uniqid (time ())));
- // 設置email頭
- $header =
- "From: $fromrn" .
- "MIME-Version: 1.0rn" .
- "Content-Type: multipart/mixed; boundary=".$msep."rnrn" .
- "--$mseprn" .
- "Content-Type: text/plainrn" .
- "Content-Transfer-Encoding: 8bitrnrn" .
- $message_body . "rn";
- // 文件名
- $dateiname = $this->datei;
- // 壓縮包大小
- $dateigroesse = filesize ($dateiname);
- // 讀取壓縮包
- $f = fopen ($dateiname, "r");
- // 保存到附件
- $attached_file = fread ($f, $dateigroesse);
- // 關閉壓縮包
- fclose ($f);
- // 建立一個附件
- $attachment = chunk_split (base64_encode ($attached_file));
- // 設置附件頭
- $header .=
- "--" . $msep . "rn" .
- "Content-Type: application/zip; name='Backup'rn" .
- "Content-Transfer-Encoding: base64rn" .
- "Content-Disposition: attachment; filename='Backup.zip'rn" .
- "Content-Description: Mysql Datenbank Backup im Anhangrnrn" .
- $attachment . "rn";
- // 標記附件結束未知
- $header .= "--$msep--";
- // 郵件標題
- $subject = "數據庫備份";
- // 發送郵件需要開啟php相應支持哦^^
- if(mail($to, $subject, '', $header) == FALSE)
- {
- die("無法發送郵件,請檢查郵箱地址");
- }
- echo "<p><small>郵件發送成功</small></p>";
- }
- }
- /**
- * 建立數據庫備份的壓縮包并保存到服務器指定目錄中
- * @return
- */
- protected function createZIP()
- {
- // 文件夾權限要夠
- chmod($this->config['folder'], 0777);
- // 建立壓縮包
- $zip = new ZipArchive();
- // 設置壓縮包文件名
- $this->datei = $this->config['folder'].$this->config['mysql'][3]."_"
- .date("j_F_Y_g_i_a").".zip";
- // 看看壓縮包能不能打開
- if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
- exit("無法打開 <".$this->datei.">n");
- }
- // 把dump出來的數據放到壓縮包里
- $zip->addFromString("dump.sql", $this->dump);
- // 關閉壓縮包
- $zip->close();
- // 看看壓縮包有沒有生成
- if(!file_exists($this->datei))
- {
- die("無法生成壓縮包");
- }
- echo "<p><small>數據庫備份壓縮包成功生成</small></p>";
- }
- /**
- * mysql dump函數
- * @param object $dump
- * @return
- */
- protected function createDUMP($dump)
- {
- $date = date("F j, Y, g:i a");
- $header = <<<HEADER
- -- SQL Dump
- --
- -- Host: {$_SERVER['HTTP_HOST']}
- -- Erstellungszeit: {$date}
- --
- -- Datenbank: `{$this->config['mysql'][3]}`
- --
- -- --------------------------------------------------------
- HEADER;
- foreach($dump AS $name => $value)
- {
- $sql .= $name.$value;
- }
- $this->dump = $header.$sql;
- }
- /**
- * 生成選擇數據表的界面函數
- * @return
- */
- public function outputForm()
- {
- // 選擇全部
- $result = mysql_list_tables($this->config['mysql'][3]);
- $buffer = '
- <fieldset>
- <legend>選擇需要備份的數據表</legend>
- <form method="post" action="">
- <select name="table[]" multiple="multiple" size="30">';
- while($row = mysql_fetch_row($result))
- {
- $buffer .= '<option value="'.$row[0].'">'.$row[0].'</option>';
- }
- $buffer .= '</select>
- <br /><br />
- <input type="submit" name="backup" value="備份選定數據表" />
- </form>
- </fieldset>';
- echo $buffer;
- }
- }
- ?>
通用數據庫備份類,代碼如下:
- <?php
- /*數據庫備份:NOTICE:此類要添加數據庫連接才能正常工作*/
- Class Back_up_databaseextendsdbstuff{
- //類開始
- var $HOST;
- var $USERNAME;
- var $PASSWORD;
- var $DATABASE;
- function Back_up_database($host,$username,$password,$database){
- //初始化數據庫連接
- $this->HOST=$host;
- $this->USERNAME=$username;
- $this->ASSWORD=$password;
- $this->DATABASE=$database;
- $Connection=$this->connect($this->HOST,$this->USERNAME,$this->ASSWORD,$this->DATABASE,$pconnect);
- $this->Connection=$Connection;
- }
- //取得數據庫中的表
- function get_table_name($database){
- $this->Connection;
- $result=mysql_list_tables($database);
- $i=0;
- while($i<mysql_num_rows($result)){
- $tb_name[$i]=mysql_tablename($result,$i);
- $table_name.=$tb_name[$i].",";
- $i++;
- }
- $this->table_name=substr($table_name,0,-1);
- return$this->table_name;
- }
- //取得每個表中的FIELDS和屬性并生成CREATETABLE語句
- function get_table_fields($table_name){
- $this->Connection;
- $createtable=dbstuff::query("SHOWCREATETABLE$table_name");
- $create=dbstuff::fetch_row($createtable);
- $tabledump.="DROPTABLEIFEXISTS$table_name;/n";
- $tabledump.=$create[1].";/n/n";
- $this->$table_name=$tabledump;
- return$this->$table_name;
- }
- //取得表中的數據并生成ISERTINTO語句
- function get_insert($table_insert_name){
- $this->Connection;
- $rows=dbstuff::query("SELECT*FROM$table_insert_name");
- $numfields=dbstuff::num_fields($rows);
- $numrows=dbstuff::num_rows($rows);
- while($row=dbstuff::fetch_row($rows)){
- $comma="";
- $tabledump.="INSERTINTO$table_insert_nameVALUES(";
- for($i=0;$i<$numfields;$i++){
- $tabledump.=$comma."'".mysql_escape_string($row[$i])."'";
- $comma=",";
- }
- $tabledump.=");/n";
- }
- $this->tabledump=$tabledump;
- return$this->tabledump;
- }
- //獲取所有數據并連接成新的字符串并將它寫入文件中.sql
- function get_string($database_name,$file_path_name){
- $time=date("Y-m-dH:j");
- $date_time=date("YmdHis");
- $file_path_name=$file_path_name.$date_time.".sql";
- $version="Antsent_Web_StudioDatabaseBackUpV1.01";
- $idstring='#Identify:'.base64_encode("$time,$version")."/n";
- $head_info="$idstring".
- "#/n".
- "#Antsnet_Web!TheBasicClassOfBackUpDataBase/n".
- "#Version:AntsnetWeb!$version/n".
- "#Timetime/n".
- "#Type:ClassOfBackUpDataBase/n".
- "#Antsnet_Web_Studio!Home:http://www.111cn.net /n".
- "#PleasevisitourwebsitefornewestinfomationaboutAntsnet_Web_Studio!/n".
- "#--------------------------------------------------------/n/n/n";
- $table_name=$this->get_table_name($database_name);
- $array_table=explode(",",$table_name);
- for($i=0;$i<count($array_table);$i++){
- $table_string.=$this->get_table_fields($array_table[$i]);
- $table_insert.=$this->get_insert($array_table[$i]);
- }
- $count_string=$head_info.$table_string.$table_insert;
- //return$count_string;
- $write_status=$this->write_file($file_path_name,$count_string);
- return$write_status;//開源代碼Vevb.com
- }
- //寫入一個文件
- function write_file($file_path,$file_contents){
- if(@!$fp=fopen($file_path,'w')){
- $status="<fontcolor=/"red/">ThisFileCouldNotOpenOrRead.</font>";
- }else{
- flock($fp,3);
- fwrite($fp,$file_contents);
- fclose($fp);
- window.google_render_ad();
- ?>
新聞熱點
疑難解答