php クラスは、データベースを完全にバックアップする機能、またはデータベース内の指定されたテーブルをバックアップする機能を実装します。
- class Backup
- {
- /**
- * @var はオプションを保存します
- */
- var $config;
- /**
- * @var は最終的な SQL ダンプを保存します
- */
- var $dump;
- /**
- * @var はテーブル構造を保存し、テーブルごとに挿入します
- */
- var $struktur = array();
- /**
- * @var zipファイル名
- */
- var $datei;
- /**
- * この関数はコンストラクターであり、オプションのフレーズです
- * そしてデータベースに接続します
- * @return
- */
- public function Backup($options)
- {
- // write options
- foreach($options AS $name => $value)
- {
- $this->config[$name] = $value;
- }
-
- // mysql 接続をチェック
- mysql_connect($this->config ['mysql'][0], $this->config['mysql'][1], $this->config['mysql'][2]) または die(mysql_error());
- mysql_select_db( $this->config['mysql'][3]) または 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);
-
- // テーブルを読み取ります "inserts"
- $sql = 'SELECT * FROM '.$table;
- $query = mysql_query($sql) または die(mysql_error());
- $feld_anzahl = mysql_num_fields($query);
-
- $sql_statement = '--
- -- データ テーブル `$table `
- --
-
- ';
-
- // 進行状況の読み取りを開始します
- 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 <$feld_anzahl;$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";
- }
- // 存在しない場合は配列に「Inserts」を挿入します
- if(!in_array($sql_statement, $insert))
- {
- array_push($insert, $sql_statement );
- unset($sql_statement);
- }
- unset($sql_statement);
- }
- // テーブル構造と挿入を 1 つの var にまとめます
- $this->struktur = array_combine($tables, $insert );
-
- // 完全なダンプを作成します
- $this->createDUMP($this->struktur);
-
- // zip ファイルを作成します
- $this->createZIP();
-
- /**バックアップを終了 * */
-
- // SQL ダンプを含むメールを送信します
- if(isset($this->config['email']) && !empty($this->config['email']))
- {
- $this->sendEmail();
- }
-
- // 出力
- echo '
バックアップ戦争erfolgreichバックアップをダウンロード
-
-
';
- }
- }
-
- /**
- * この関数は添付ファイル付きのメールを生成します
- * @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 ())));
-
- // メールヘッダーを設定します (テキストのみ)
- $header =
- "From: $fromrn" .
- "MIME-Version: 1.0rn" .
- "Content-Type: multipart/mixed ; border="$msep"rnrn" .
- "--$mseprn" .
- "Content-Type: text/plainrn" .
- "Content-Transfer-Encoding: 8bitrnrn" .
- $message_body 。 "rn";
-
- // ファイル名
- $dateiname = $this->datei;
-
- // zip ファイルのファイルサイズを取得
- $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 = "Database Backup";
-
- // 電子メールを電子メールに送信します^ ^
- if(mail($to, $subject, '', $header) == FALSE)
- {
- die("メールを送信できませんでした。メールアドレスを確認してください。");
- }
-
- echo "
メールは正常に送信されました。 ";
- }
- }
-
- /**
- * この関数はデータベースダンプを含む zip ファイルを作成し、FTP サーバーに保存します
- * @return
- */
- protected function createZIP()
- {
-
- // 権限を 777 に設定
- chmod($this->config['folder'], 0777);
-
- // zip を作成file
- $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("cannot open <".$this->datei.">n");
- }
-
- // mysql ダンプを zip ファイルに追加します
- $zip->addFromString ("dump.sql", $this->dump);
- // ファイルを閉じる
- $zip->close();
-
- // ファイルが作成されたかを確認する
- if(!file_exists($this-> ;datei))
- {
- die("ZIP ファイルを作成できませんでした。");
- }
-
- echo "
ZIP が作成されました。 ";
- }
-
- /**
- * この関数は完全な SQL ダンプを作成します
- * @param object $dump
- * @return
- */
- protected function createDUMP($dump)
- {
- $date = date("F j, Y, g:i a");
-
- $header = << ;
复制代
备份用法:
-
- //メールアドレスは好きなだけ追加できます
- $options = array('email' => array('email1', 'email2'),
- 'フォルダー' => './backup/',
- 'mysql' => array('localhost', 'root', '****', 'database'));
-
- $b = 新しいバックアップ( $options);
-
- // フォームを送信した場合、バックアップを開始します
- if(isset($_POST['backup']))
- {
- // バックアップを開始します
- $b->backupDB();
- }
-
- //テーブルを表示します
- $b->outputForm();
-
- ?>
复制代码
|