ホームページ >バックエンド開発 >PHPチュートリアル >PHP は mysql データベース バックアップ クラスを実装します_PHP チュートリアル

PHP は mysql データベース バックアップ クラスを実装します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:53:31911ブラウズ

1. DbBak をインスタンス化するには、データ サーバーの場所 ($connectid) とバックアップ先のディレクトリ ($backupDir) という 2 つのことを DbBak に伝える必要があります。 TableBak.php') ;
$connectid = mysql_connect('localhost','root','123456');
$backupDir = 'data'; データベースをバックアップするだけでなく、ただし、バックアップするテーブルのみを詳細に設定することもできます:
2.1 mybbs ライブラリ内のすべてのテーブルをバックアップしたい場合は、これを実行するだけです:

$DbBak->backupDb('mybbs ');

2.2 mybbs ライブラリ内のボード、フェイス、およびフレンドリストのテーブルのみをバックアップしたい場合は、1 次元配列で指定できます:

$DbBak->backupDb('mybbs',array('board', ' face','friendsite'));

2.3 ボード テーブルなどの 1 つのテーブルのみをバックアップする場合:
$DbBak->backupDb('mybbs','board');リカバリ:
2.1 の場合、2.1 および 2.3 の 3 つのケースでは、ステートメントを適宜変更し、backupDb をrestoreDb に置き換えることでデータをリカバリできます:

$DbBak->restoreDb('mybbs'); ->restoreDb ('mybbs',array('board','face','friendsite'));
PHP コード
$DbBak->restoreDb('mybbs','board');
PHP コード
require_once ('TableBak.php');
var $_mysql_link_id;
var $_tableList;
( (! is_string($dataDir) ) || strlen($dataDir)==0) && die('エラー:$dataDir は文字列ではありません');
!is_dir($dataDir) && mkdir($dataDir); >_dataDir = $ dataDir;
$this->_mysql_link_id = $_mysql_link_id
}

function BackupDb($dbName,$tableName=null)
{
( (!is_string($dbName)) || str len( $dbName)==0 ) && die('$dbName は文字列値である必要があります');
//ステップ 1: データベースを選択します:
!is_dir($dbDir); mkdir($dbDir);
//ステップ 3: データベース内のすべてのテーブル名を取得し、テーブルのバックアップを開始します
$this->_TableBak = new TableBak($this->_mysql_link_id ,$dbDir); ($tableName)){//データベース内のすべてのテーブルをバックアップします
$this->_backupAllTable($dbName)
}
if(is_string($tableName)){
(strlen($tableName)== 0) && die('....');
$this->_backupOneTable($dbName,$tableName)
}
if (is_array($tableName) ){
foreach ($tableName として) table){
( (!is_string($table)) || strlen($table)==0 ) && die('....')
}
$this- >_backupSomeTalbe($dbName,$tableName) );
戻る;    

関数restoreDb($dbName,$tableName=null){
((!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName は文字列値である必要があります');    
//ステップ 1: データベース库が存在するかどうか 并接続:
@mysql_select_db($dbName) || die("データベース$dbName線量は存在しません");    
//ステップ 2:检查が存在するかどうかデータ据库备份目录
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;    
!is_dir($dbDir) && die("$dbDir 存在しません");    
//ステップ 3:復元の開始
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);    
if(is_null($tableName)){//データベース内のすべてのテーブルをバックアップします
$this->_restoreAllTable($dbName);    
戻る;    
}
if(is_string($tableName)){
(strlen($tableName)==0) && die('....');    
$this->_restoreOneTable($dbName,$tableName);    
戻る;    
}
if (is_array($tableName)){
foreach ($tableName as $table){
( (!is_string($table)) || strlen($table)==0 ) && die('... .');    
}
$this->_restoreSomeTalbe($dbName,$tableName);    
戻る;    
}
}

function_getTableList($dbName)
{
$tableList = array();    
$result=mysql_list_tables($dbName,$this->_mysql_link_id);    
for ($i = 0; $i < mysql_num_rows($result); $i++){
array_push($tableList,mysql_tablename($result, $i));    
}
mysql_free_result($result);    
$tableList を返す;    
}

function _backupAllTable($dbName)
{
foreach ($this->_getTableList($dbName) as $tableName){
$this->_TableBak->backupTable($tableName);    
}
}

function _backupOneTable($dbName,$tableName)
{
!in_array($tableName,$this->_getTableList($dbName)) && die("指定された表名$tableName< /b>データ库中に存在しません");    
$this->_TableBak->backupTable($tableName);    
}

function_backupSomeTalbe($dbName,$TableNameList)
{
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->_getTableList($dbName)) && die("指定された表名前$tableNameデータベース库中に存在しません");    
}
foreach ($TableNameList as $tableName){
$this->_TableBak->backupTable($tableName);    
}
}    

function _restoreAllTable($dbName)
{
//step1:すべてのデータテーブルのファイルが存在するかどうか、および可読かどうか:
foreach ($this->_getTableList($dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");    
}
//step2:start restore
foreach ($this->_getTableList($dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';    
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}
}

function_restoreOneTable($dbName,$tableName)
{
//step1:检查の有無データ表:
!in_array($tableName,$this->_getTableList($dbName)) &&死ね("指定されたテーブル名$tableNameデータベース库中に存在しません");    
//ステップ 2:データテーブル备份文件が存在するかどうか、および書き込み可能かどうか:
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");    
//ステップ 3:復元の開始
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}
function _restoreSomeTalbe($dbName,$TableNameList)
{
//step1:检查が存在するかどうかデータ表:
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->) ;_getTableList($ dbName)) && die("指定された表名$tableNameデータベース库中に存在しません");    
}
//ステップ 2:检查が存在するかどうかデータテーブル备份文件およびどうか書き込み可能:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");    
}    
//ステップ 3:復元の開始:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';    
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}
}
}
?>     

复制代码代码如下:

//DbBak のみがこのクラスを呼び出すことができます
class TableBak{
var $_mysql_link_id;
var $_dbDir
//private $_DbManager)
{
$ this->_mysql_link_id = $mysql_link_id;
$this->_dbDir = $dbDir;

function BackupTable($tableName)
{
//ステップ 1: テーブルのバックアップ ディレクトリ名を作成します:
$tableDir = $this ->_dbDir.DIRECTORY_SEPARATOR.$tableName;
!is_dir($tableDir) && mkdir($tableDir);
//ステップ 2: バックアップを開始します:
$this->_backupTable($tableName,$tableDir);
OnFunction RESTORETable ($ tableneme, $ tablebakfile) {
Set_time_limit (0); ファイル "); n $ Num = カウント ($ Filearray);
mysql_unbuffered_query("DELETE FROM $tableName");
$sql = $fileArray[0 ];
for ($i=1;$imysql_unbuffered_query($sql.$fileArray [ $i]) または (die (mysql_error())); ;
}

function _getFieldInfo($tableName){
$fieldInfo = array(); ="SELECT * FROM $tableName LIMIT 1"; num_field=mysql_num_fields($result);
for($i=0;$i$ field_name=mysql_field_name($result,$i);
$field_type=mysql_field_type($result,$i) ); $ fieldinfo [$ field_type} field_value)."'";break; $row[$field_name] = "'".mysql_escape_string($field_value).break; ".mysql_escape_string($field_value)."'";break; "time": $row[$field_name] = " .mysql_escape_string($field_value)."'";break; row[$field_name] = "'".mysql_escape_string($field_value)."'";break; row[$フィールド名] = intval($フィールド値);
ケース "タイムスタンプ":$row[$フィールド名] = ブレイク;
デフォルト: $row[$フィールド名] = ブレイク;
}
}
return $row;
}
function _backupTable($tableName,$tableDir)
{
//テーブルのフィールドタイプを取得します:
$fieldInfo = $this->getFieldInfo($tableName); :Construction INSERT ステートメントの前半とファイルへの書き込み:
$fields = array_keys($fieldInfo);
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName .'.sql';
(!$handle = fopen($datafile,'w')) && die("ファイル $datafile$datafile");
fclose($handle); ステップ 2: データを取得してファイルに書き込みます:
//テーブル リソースを削除します:
Set_time_limit (0);
$ SQL = "Select*from $ Tableename"; ファイルを開けません $datafile");
//テーブル レコードを 1 つ取得します1 つずつ増やしてファイルに書き込みます:
while ($row = mysql_fetch_assoc($result)) {
$row = $this-> ;_quoteRow($fieldInfo,$row); $record=' データをファイルに書き込めません$datafile");
}
mysql_free_result($result);
//ファイルを閉じる:
fclose($handle);

re Turn true;
}

;
$connectid = mysql_connect( 'localhost','root','123456');
$backupDir = 'data';
$DbBak($connectid,$backupDir); ; mybbs データベースを復元します:




コードをコピーします: コードは次のとおりです:


require_once('TableBak.php'); ','root ','123456');
$backupDir = 'data';
$DbBak->restoreDb('mybbs');


http://www.bkjia.com/PHPjc/318669.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/318669.html

技術記事

1. DbBak をインスタンス化するには、データ サーバーの場所 ($connectid) とバックアップ先のディレクトリ ($backupDir) という 2 つのことを DbBak に伝える必要があります。 '); $co ...



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