この記事の例では、PHP での MySQL データベースのバックアップと復元クラスの実装について説明します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:
これは、mysql データベースをバックアップするために PHP を使用する非常に単純なクラス ファイルです。dbmange で接続アドレス、ユーザー名、データベースを設定するだけです。このコードを一緒に見てみましょう。
コードをコピーします コードは次のとおりです:
/**
※作成時期:2012年5月21日
*
* 注: ボリューム ファイルは _v1.sql (20120522021241_all_v1.sql) で終わります
* 機能: mysql データベースのボリュームバックアップを実現し、バックアップ用のテーブルを選択し、単一の SQL ファイルとボリュームの SQL インポートを実現します
* 使用方法:
*
* ------1. データベースのバックアップ(エクスポート) ---------------------------------- -- ------------------------
//それらは、ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
// パラメータ: バックアップするテーブル (オプション)、バックアップ ディレクトリ (オプション、デフォルトはバックアップ)、ボリューム サイズ (オプション、デフォルトは 2000、つまり 2M)
$db->バックアップ ();
* ------2. データベースのリカバリ(インポート) ---------------------------------- -- ------------------------
//それらは、ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//パラメータ: SQLファイル
$db->restore ( './backup/20120516211738_all_v1.sql');
*------------------------------------------------ - ------------------------
*/
クラス DBManage
{
var $db; // データベース接続
var $database; // 使用されるデータベース
var $sqldir; // データベースのバックアップ フォルダー
var $レコード
// 改行文字
プライベート$ds = "n";
// SQLを格納する変数
パブリック $sqlContent = "";
// 各 SQL ステートメントの終了文字
パブリック $sqlEnd = ";";
/**
*初始化
*
* @param string $host
* @param string $username
* @param string $password
* @param string $thisatabase
* @param string $charset
*/
関数 __construct($host = 'localhost', $username = 'root', $password = '', $thisatabase = 'test', $charset = 'utf8')
{
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $thisatabase;
$this->charset = $charset;
$this->db = mysql_connect ($this->host, $this->username, $this->password) or die ( "データベース接続に失敗しました。" );
//使用するデータベースを選択します
mysql_select_db ( $this->database, $this->db ) or die ( "データベースを開けません" );
// データベースのエンコード方法
mysql_query ( 'SET NAMES ' . $this->charset, $this->db );
}
/*
*------------------------------------------データベースバックアップ開始---- -------------------------------------------------- ----
*/
/**
* データベースのバックアップ
* パラメーター: バックアップするテーブル (オプション)、バックアップ ディレクトリ (オプション、デフォルトはバックアップ)、ボリューム サイズ (オプション、デフォルトは 2000、つまり 2M)
* *
* @param $string $dir
* @param int $size
* @param $string $テーブル名
*/
関数バックアップ($tablename = ''、$dir = ''、$size = 2000)
{
//$dir = $dir : 'バックアップ/';
//$size = $size $size : 2000;
$sql = '';
// 特定のテーブルのみをバックアップします
if (! emptyempty ( $tablename ))
echo 'テーブル名をバックアップしています' . '
';
// ダンプ情報を挿入します。
$sql = $this->_retrieve();
//テーブル構造情報を挿入します
$sql .= $this->_insert_table_struct ($tablename);
//データを挿入します
$data = mysql_query ( "select * from " . $tablename );
//ファイル名の最初の部分
$filename = date ( 'YmdHis' )
。
//フィールド数
$num_fields = mysql_num_fields ($data);
// ジジボリューム分
To '' to 'dle' s out out out out out out out out out out out out of together together oft off off off
while ( $record = mysql_fetch_array ( $data ) )
// シングルレコード
$sql .= $this->_insert_record ( $tablename, $num_fields, $record );
// ボリュームサイズより大きい場合、ファイルを書き込む
If (strlen ( $sql ) >= $size * 1000)
$file = $filename .sql;
If ($this->_write_file ($sql, $file, $dir))
echo "table-" . "-volume-" . $p . "-データのバックアップが完了し、バックアップ ファイルが生成されます$dir$filenameスパン>< ;br />";
それ以外
echo "バックアップ テーブル-" . "-失敗しました
";
// 次のサブロール个
// $ sql変数を空にリセットし、変数のサイズを再計算
$sql = "";
// SQL のサイズだけではサイズをスコアリングするのに十分ではありません
If ($sql != "")
$filename .= "_v" .sql";
If ($this->_write_file ($sql, $filename, $dir))
echo "table-" . "-volume-" . $p . "-データのバックアップが完了し、バックアップ ファイルが生成されます$dir$filename";
それ以外
エコー「バックアップ」 - $ p
それ以外
。
If ($tables = mysql_query ( "show table status from " . $this->database ))
echo "データベース構造を正常に読み取りました!
";
それ以外
。
// ダンプ情報を挿入します。
$sql .= $this->_retrieve();
//ファイル名の最初の部分
$filename = date ( 'YmdHis' ) 。
//すべてのテーブルを見つけます
$tables = mysql_query ( 'SHOW TABLES' );
// ジジボリューム分
//すべてのテーブルをループします
while ( $table = mysql_fetch_array ( $tables ) )
//テーブル名を取得します$tablename = $table [0];
//テーブル構造を取得します
$ sql。=
$data = mysql_query ( "select * from " . $tablename );
$num_fields = mysql_num_fields ($data);
//各レコードをループします
//単一レコード
$ sql。= $ this-&gt; _insert_record($ tablename、$ num_fields、$ record);
//ボリュームサイズよりも大きい場合は、ファイルを書き込みます
If (strlen ($sql) >= $size * 1000)
$ file = $
// ファイルを書き込む 文
If ($this->_write_file ($sql, $file, $dir))
echo "-volume-" . "-データのバックアップが完了しました。バックアップ ファイル$dir$file< ;/span>
";
それ以外
echo "バックアップ ボリューム-" . "-失敗しました
";
// 次のサブロール个
// $ sql変数を空にリセットし、変数のサイズを再計算
$sql = "";
// SQL のサイズだけではサイズをスコアリングするのに十分ではありません
If ($sql != "")
$filename .= "_v" .sql";
If ($this->_write_file ($sql, $filename, $dir))
ない、ない、ない、ない、エコー "-ボリューム-" . $p . "-データのバックアップが完了しました、バックアップ ファイルが生成されました $dir$filename
" ;
それ以外
エコー「バックアップ」 - $ p
}
/**
* 基本的なデータベースのバックアップ情報を挿入します
* *
* @return 文字列
*/
プライベート関数 _retrieve() {
$value = '';
$value .= '--'
$value .= '-- MySQL データベース ダンプ' .
$value .= '-- DBManage クラス、Power By yanue によって作成されました ' .
$value .= '-- http://yanue.net '
$value .= '--'
$value .= '-- ホスト: ' . $this->ds;
$value .= '-- 日付: ' . date ( 'Y' ) . ' month ' . ' day' .私' ) $this->ds;
$value .= '-- MySQL バージョン: ' . mysql_get_server_info () .
$value .= '-- PHP バージョン: ' . phpversion () .
$value .= $this->ds;
$value .= '--'
$value .= '-- データベース: `' . $this->ds;
$value .= '--' . $this->ds;
$value .= '-------------------------------------------- -----------------------';
$value .= $this->ds . $this->ds;
$value を返す;
}
/**
* テーブル構造を挿入します
* *
* @param 不明なタイプ $table
* @return 文字列
*/
プライベート関数 _insert_table_structor($table) {
$sql = '';
$sql .= "--" . $this->ds;
$sql .= "--テーブル構造" . $this->ds;$sql .= "--" . $this->ds;
// テーブルが存在する場合は削除します
$sql .= "DROP TABLE IF EXISTS `" . $this->sqlEnd
// 詳細なテーブル情報を取得します
$res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );
$row = mysql_fetch_array ($res);
$sql .= $row [1];
$sql .= $this->sqlEnd . $this->ds;
//
$sql .= $this->ds;
$sql .= "--" .
$ Sql. = "-" デポジットテーブルのデータ ".$ Table. $ This-> ds;
$sql .= "--"
$sql .= $this->ds;
return $sql;
}
/**
* 単一レコードを挿入します
* *
* @param string $table
* @param int $num_fields
* @param 配列 $record
* @return 文字列
*/
プライベート関数 _insert_record($table, $num_fields, $record) {
// カンマ区切りの SQL フィールド
$insert = $comma = "";
$insert .= "INSERT INTO `" . "` VALUES(";
// 各サブセクションのコンテンツをループします
for($i = 0; $i
$insert .= ($comma . "'" .mysql_real_escape_string ( $record [$i] ) . "'");
$comma = ",";
$insert .= ");
return $insert;
}
/**
*ファイルに書き込む
* *
* @param 文字列 $sql
* @param string $ファイル名
* @param 文字列 $dir
* @return ブール値
*/
プライベート関数 _write_file($sql, $filename, $dir) {
$dir = $dir ? $dir : './backup/';
// フォルダーが存在しない場合は作成します
If (! file_exists ( $dir )) {
mkdir ( $dir );
$re = true;
If (! @$fp = fopen ( $dir . $filename, "w+" )) {
$re = false;
echo "ファイルを開けませんでした!";
If (! @fwrite ( $fp, $sql )) {
$re = false;
echo "ファイルの書き込みに失敗しました。ファイルが書き込み可能かどうかを確認してください。";
If (! @fclose ( $fp )) {
$re = false;
echo "ファイルを閉じることができませんでした!";
return $re;
}
/*
*
* ---------------------------- 上: データベースのエクスポート ----------- 分割線 ---- ------ 次: データベースのインポート--------------------------------
*/
/**
* バックアップデータをインポートします
* 説明: ボリューム ファイル形式 20120516211738_all_v1.sql
* パラメータ: ファイルパス (必須)
* *
* @param 文字列 $sqlfile
*/
関数の復元($sqlfile)
{
if (! file_exists ( $sqlfile ))
exit (「ファイルが存在しません。確認してください」);
$this->lock ( $this->database );
// データベースの保存場所を取得します
$sqlpath = pathinfo ($sqlfile);
$this->sqldir = $sqlpath ['dirname'];
// サブボリュームが含まれているかどうかを確認し、20120516211738_all_v1.sql を _v から分離します。サブボリュームがあることを意味します
$volume =explode ( "_v", $sqlfile );
$volume_path = $volume [0];
echo "プログラムが終了しないように、ブラウザを更新して閉じないでください。注意しないと、データベース構造が破損します。";
echo "バックアップ データをインポートしています。お待ちください!
";
if (emptyempty ( $volume [1] ))
echo "SQL をインポートしています:
";
// スコアなし
If ($this->_import ( $sqlfile )) {
echo "データベースは正常にインポートされました!";
それ以外
。
それ以外
//$volume_id = array();
// スクロールがある場合、現在の 1 ポイント ボリュームが表示され、残りのスクロールが実行されます。
$volume_id =explode ( ".sq", $volume [1] );
//現在のボリュームは $volume_id です
$volume_id = intval ( $volume_id [0] );while ( $volume_id )
$tmpfile = $volume_id .sql;
// 他にもスクロールがあるため、実行を続けます
If (file_exists ( $tmpfile )) {
//インポートメソッドを実行します
Echo は、サブロール & lt; span style = 'color:#f00;' を導入しています。 '& Lt; br /& gt;
If ($this->_import ($tmpfile))
それ以外
exit ( "ボリュームのインポート" . $tmpfile . '失敗! データベース構造が破損している可能性があります! ボリューム 1 からインポートしてください' ) ;
それ以外
echo "このボリュームのすべてのバックアップは正常にインポートされました!
";
戻る;
$volume_id++;
}
/**
* SQLをデータベースにインポートします(通常のインポート)
* *
* @param 文字列 $sqlfile
* @return ブール値
*/
プライベート関数 _import($sqlfile) {
$sqls = array ();
$f = fopen ( $sqlfile, "rb" );
// テーブルバッファ変数を作成します
$create = '';
// SQLの各行を読み取ります
$line = fgets ( $f );
// 「--」などのコメントが含まれている場合、または空行の場合はスキップします
If (trim ( $line ) == '' || preg_match ( '/--*?/', $line, $match )) {
続く;
//終わりに ';'、つまり完全なSQLステートメントが含まれている場合、ここに挿入ステートメントがあります)、「Engine =」(つまり、テーブルを作成するための最後の文)が含まれていません。
If (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) {
// この SQL ステートメントと作成されたテーブル SQL 接続を保存します
$create .= $line;
// // 作成時の最後の文が含まれている場合テーブル
If (preg_match ( '/ENGINE=/', $create, $match )) {
//それをSQLアレイにマージします
$sqls [] = $create;
// 現在のテーブルをクリアし、次のテーブルを作成する準備をします
$create = '';
// 今回はスキップ
続く;
$sqls [] = $line;
fclose ( $f );
// SQL ステートメントの配列をループし、個別に実行します
foreach ( $sqls as $sql ) {
str_replace ( "n", "", $sql );
If (! mysql_query ( トリム ( $sql ) )) {
echo mysql_error();
falseを返します。
true を返す;
}
/*
* -----------------------------データベースインポート終了--------------- - -----------------
*/
//データベース接続を閉じる
プライベート関数 close() {
mysql_close ( $this->db );
}
// バックアップまたはインポート中のエラーを避けるためにデータベースをロックします
プライベート関数 lock($tablename, $op = "WRITE") {
If (mysql_query ( "lock tables " . $tablename . " " . $op ))
true を返す;
それ以外
false を返す;
}
// ロックを解除します
プライベート関数unlock() {
If (mysql_query ( "テーブルのロックを解除" ))
true を返す;
それ以外
false を返す;
}
// 破壊
関数 __destruct() {
mysql_query ( "テーブルのロックを解除", $this->db );
mysql_close ( $this->db );
}
}
$db = 新しい DBManage ( 'localhost', 'root', '', 'tao', 'gbk' );
//$db->バックアップ ('tao_admin');
$db->restore ('./backup/20140228222713_tao_admin_v1.sql');
?>
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。
http://www.bkjia.com/PHPjc/924539.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/924539.html技術記事 PHP による MySQL データベースのバックアップおよび復元クラスの例、mysql データベース バックアップの実装 この記事では、MySQL データベースのバックアップおよび復元クラスの PHP 実装の例について説明します。参考のためにみんなで共有してください。具体的な分析は以下の通りです...