-
-
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資料庫備份類別的實作代碼:
-
-
/**
- * 備份mysql資料庫
- * edit: bbs.it-home.org
- */
- 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(empty($_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 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 $name = mysql_field_name($query,$i);
- if (empty($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();
-
- /**備份結束 **/
-
- // 寄一封郵件到指定郵箱,附件包含備份,如果你設定了的話^_^
- if(isset($this->config['email']) && !empty($this->config['email']))
- {
- $this->sendEmail();
- }
-
- // output
- echo '
備份完成啦
下載備份
-
';
- }
- }
-
- / **
- * 傳送郵件函數
- * @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 = f ($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="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 "
郵件發送成功 ";
- }}
-
- /**
- * 建立資料庫備份的壓縮包並儲存到伺服器指定目錄
- * @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("無法開啟datei.">n");
- }
-
- // 把dump出來的資料放到壓縮包裡
- $zip->addFromString("dump.sql", $this-> dump);
- // 關閉壓縮包
- $zip->close();
-
- // 看看壓縮包有沒有產生
- if(!file_exists($this->datei ))
- {
- die("無法產生壓縮套件");
- }
-
- echo "
資料庫備份壓縮封包成功產生 ";
- }
-
- /**
- * mysql dump 函數
- * @param object $dump
- * @return
- */
- protected function createDUMP($dump)
- {
- $date = date("F j, Y, g :i a");
-
- $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 = '
-
';
-
- echo $buffer;
- }
- }
- ?>
複製程式碼
|