ホームページ  >  記事  >  バックエンド開発  >  PHP は MySQL データベース全体をバックアップするか、テーブルを指定します

PHP は MySQL データベース全体をバックアップするか、テーブルを指定します

WBOY
WBOYオリジナル
2016-07-25 08:45:17921ブラウズ

php クラスは、データベースを完全にバックアップする機能、またはデータベース内の指定されたテーブルをバックアップする機能を実装します。

  1. class Backup
  2. {
  3. /**
  4. * @var はオプションを保存します
  5. */
  6. var $config;
  7. /**
  8. * @var は最終的な SQL ダンプを保存します
  9. */
  10. var $dump;
  11. /**
  12. * @var はテーブル構造を保存し、テーブルごとに挿入します
  13. */
  14. var $struktur = array();
  15. /**
  16. * @var zipファイル名
  17. */
  18. var $datei;
  19. /**
  20. * この関数はコンストラクターであり、オプションのフレーズです
  21. * そしてデータベースに接続します
  22. * @return
  23. */
  24. public function Backup($options)
  25. {
  26. // write options
  27. foreach($options AS $name => $value)
  28. {
  29. $this->config[$name] = $value;
  30. }
  31. // mysql 接続をチェック
  32. mysql_connect($this->config ['mysql'][0], $this->config['mysql'][1], $this->config['mysql'][2]) または die(mysql_error());
  33. mysql_select_db( $this->config['mysql'][3]) または die(mysql_error());
  34. }
  35. /**
  36. * この関数はバックアップの進行を開始し、そのコア関数です
  37. * @return
  38. */
  39. public function BackupDB()
  40. {
  41. // バックアップを開始します
  42. if (isset($_POST['backup']))
  43. {
  44. // テーブルが選択されているかどうかを確認します
  45. if(empty($_POST['table']))
  46. {
  47. die("テーブルを選択してください。");
  48. }
  49. /**バックアップを開始 **/
  50. $tables = array();
  51. $insert = array();
  52. $sql_statement = '';
  53. // テーブルをロック
  54. foreach($_POST['table' ] AS $table)
  55. {
  56. mysql_query("LOCK TABLE $table WRITE");
  57. // テーブル構造を読み取ります
  58. $res = mysql_query('SHOW CREATE TABLE '.$table.'');
  59. $createtable = mysql_result ($res, 0, 1);
  60. $str = "nn".$createtable."nn";
  61. array_push($tables, $str);
  62. // テーブルを読み取ります "inserts"
  63. $sql = 'SELECT * FROM '.$table;
  64. $query = mysql_query($sql) または die(mysql_error());
  65. $feld_anzahl = mysql_num_fields($query);
  66. $sql_statement = '--
  67. -- データ テーブル `$table `
  68. --
  69. ';
  70. // 進行状況の読み取りを開始します
  71. while($ds = mysql_fetch_object($query)){
  72. $sql_statement .= 'INSERT INTO `'.$table.'` (';
  73. for ($i = 0;$i if ($i ==$feld_anzahl-1){
  74. $sql_statement .= mysql_field_name($query,$i);
  75. } else {
  76. $ sql_statement .= mysql_field_name($query,$i).', ';
  77. }
  78. }
  79. $sql_statement .= ') VALUES (';
  80. for ($i = 0;$i <$feld_anzahl;$i++) ){
  81. $name = mysql_field_name($query,$i);
  82. if (empty($ds->$name)){
  83. $ds->$name = 'NULL';
  84. }
  85. if ($i ==$feld_anzahl-1){
  86. $sql_statement .= '"'.$ds->$name.'"';
  87. } else {
  88. $sql_statement .= '"'.$ds->$name. '", ';
  89. }
  90. }
  91. $sql_statement .= ");n";
  92. }
  93. // 存在しない場合は配列に「Inserts」を挿入します
  94. if(!in_array($sql_statement, $insert))
  95. {
  96. array_push($insert, $sql_statement );
  97. unset($sql_statement);
  98. }
  99. unset($sql_statement);
  100. }
  101. // テーブル構造と挿入を 1 つの var にまとめます
  102. $this->struktur = array_combine($tables, $insert );
  103. // 完全なダンプを作成します
  104. $this->createDUMP($this->struktur);
  105. // zip ファイルを作成します
  106. $this->createZIP();
  107. /**バックアップを終了 * */
  108. // SQL ダンプを含むメールを送信します
  109. if(isset($this->config['email']) && !empty($this->config['email']))
  110. {
  111. $this->sendEmail();
  112. }
  113. // 出力
  114. echo '

    バックアップ戦争erfolgreich

    バックアップをダウンロード


  115. ';
  116. }
  117. }
  118. /**
  119. * この関数は添付ファイル付きのメールを生成します
  120. * @return
  121. */
  122. protected function sendEmail()
  123. {
  124. // メール送信開始
  125. foreach($this->config['email'] AS $email)
  126. {
  127. $to = $email ;
  128. $from = $this->config['email'][0];
  129. $message_body = "このメールにはデータベースのバックアップが zip ファイルとして含まれています。";
  130. $msep = strtoupper (md5 (uniqid (time ())));
  131. // メールヘッダーを設定します (テキストのみ)
  132. $header =
  133. "From: $fromrn" .
  134. "MIME-Version: 1.0rn" .
  135. "Content-Type: multipart/mixed ; border="$msep"rnrn" .
  136. "--$mseprn" .
  137. "Content-Type: text/plainrn" .
  138. "Content-Transfer-Encoding: 8bitrnrn" .
  139. $message_body 。 "rn";
  140. // ファイル名
  141. $dateiname = $this->datei;
  142. // zip ファイルのファイルサイズを取得
  143. $dateigroesse = filesize ($dateiname);
  144. // ファイルを開く
  145. $ f = fopen ($dateiname, "r");
  146. // コンテンツを保存
  147. $attached_file = fread ($f, $dateigroesse);
  148. // ファイルを閉じる
  149. fclose ($f);
  150. // 添付ファイルを作成
  151. $ attachment = chunk_split(base64_encode($attached_file));
  152. // 添付ファイルヘッダーを設定します
  153. $header .=
  154. "--" . $msep 。 "rn" .
  155. "Content-Type: application/zip; name='Backup'rn" .
  156. "Content-Transfer-Encoding:base64rn" .
  157. "Content-Disposition:attachment; filename='Backup.zip'rn" .
  158. "Content-Description: Mysql Datenbank Backup im Anhangrnrn" .
  159. $attachment . "rn";
  160. // 添付ファイルの終わりをマークします
  161. $header .= "--$msep--";
  162. // 電子メールの件名
  163. $subject = "Database Backup";
  164. // 電子メールを電子メールに送信します^ ^
  165. if(mail($to, $subject, '', $header) == FALSE)
  166. {
  167. die("メールを送信できませんでした。メールアドレスを確認してください。");
  168. }
  169. echo "

    メールは正常に送信されました。

    ";
  170. }
  171. }
  172. /**
  173. * この関数はデータベースダンプを含む zip ファイルを作成し、FTP サーバーに保存します
  174. * @return
  175. */
  176. protected function createZIP()
  177. {
  178. // 権限を 777 に設定
  179. chmod($this->config['folder'], 0777);
  180. // zip を作成file
  181. $zip = new ZipArchive();
  182. // ファイル名を作成
  183. $this->datei = $this->config['folder'].$this->config['mysql'][3] ."_".date("j_F_Y_g:i_a").".zip";
  184. // ファイルが作成できたか確認
  185. if ($zip->open($this->datei, ZIPARCHIVE::CREATE) )!==TRUE) {
  186. exit("cannot open <".$this->datei.">n");
  187. }
  188. // mysql ダンプを zip ファイルに追加します
  189. $zip->addFromString ("dump.sql", $this->dump);
  190. // ファイルを閉じる
  191. $zip->close();
  192. // ファイルが作成されたかを確認する
  193. if(!file_exists($this-> ;datei))
  194. {
  195. die("ZIP ファイルを作成できませんでした。");
  196. }
  197. echo "

    ZIP が作成されました。

    ";
  198. }
  199. /**
  200. * この関数は完全な SQL ダンプを作成します
  201. * @param object $dump
  202. * @return
  203. */
  204. protected function createDUMP($dump)
  205. {
  206. $date = date("F j, Y, g:i a");
  207. $header = << ;-- SQL ダンプ
  208. --
  209. -- ホスト: {$_SERVER['HTTP_HOST']}
  210. -- Erstellungszeit: {$date}
  211. --
  212. -- Datenbank: `{$this-> ;config['mysql'][3]}`
  213. --
  214. -- ----------------------------- -------------------------
  215. HEADER;
  216. foreach($dump AS $name => $value)
  217. {
  218. $sql .= $name.$value;
  219. }
  220. $this->dump = $header.$sql;
  221. }
  222. /**
  223. * この関数はテーブルを選択するための出力フォームを表示します
  224. * @return
  225. */
  226. public function OutputForm()
  227. {
  228. // データベースからすべてのテーブルを選択します
  229. $result = mysql_list_tables($this->config['mysql'][3]);
  230. $buffer = '
  231. 一部を選択tables


  232. < ;/form>
  233. ';
  234. echo $buffer;
  235. }
  236. }
  237. ?>
复制代

备份用法:
  1. //メールアドレスは好きなだけ追加できます
  2. $options = array('email' => array('email1', 'email2'),
  3. 'フォルダー' => './backup/',
  4. 'mysql' => array('localhost', 'root', '****', 'database'));
  5. $b = 新しいバックアップ( $options);
  6. // フォームを送信した場合、バックアップを開始します
  7. if(isset($_POST['backup']))
  8. {
  9. // バックアップを開始します
  10. $b->backupDB();
  11. }
  12. //テーブルを表示します
  13. $b->outputForm();
  14. ?>
复制代码

php、MySQL


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。