<?php <br />
<br>
class
DbManage { <br>
var
$db
;
var
$database
;
var
$sqldir
;
private
$ds
=
"n"
; <br>
public
$sqlContent
=
""
; <br>
public
$sqlEnd
=
";"
; <br>
<br>
<br>
function
__construct(
$host
=
'localhost'
,
$username
=
'root'
,
$password
=
''
,
$database
=
'test'
,
$charset
=
'utf8'
) { <br>
$this
->host =
$host
; <br>
$this
->username =
$username
; <br>
$this
->password =
$password
; <br>
$this
->database =
$database
; <br>
$this
->charset =
$charset
; <br>
set_time_limit(0);
@ob_end_flush(); <br>
$this
->db = @mysql_connect (
$this
->host,
$this
->username,
$this
->password )
or
die
(
'<p><span>Mysql Connect Error : </span>'
.mysql_error().
'</p>'
); <br>
mysql_select_db (
$this
->database,
$this
->db )
or
die
(
'<p><span>Mysql Connect Error:</span>'
.mysql_error().
'</p>'
); <br>
mysql_query (
'SET NAMES '
.
$this
->charset,
$this
->db ); <br>
<br>
} <br>
<br>
<br>
function
getTables() { <br>
$res
= mysql_query (
"SHOW TABLES"
); <br>
$tables
=
array
(); <br>
while
(
$row
= mysql_fetch_array (
$res
) ) { <br>
$tables
[] =
$row
[0]; <br>
} <br>
return
$tables
; <br>
} <br>
<br>
<br>
<br>
<br>
function
backup(
$tablename
=
''
,
$dir
,
$size
) { <br>
$dir
=
$dir
?
$dir
:
'./backup/'
; <br>
if
(!
is_dir
(
$dir
)) { <br>
mkdir
(
$dir
, 0777, true )
or
die
(
'创建文件夹失败'
); <br>
} <br>
$size
=
$size
?
$size
: 2048; <br>
$sql
=
''
; <br>
if
(! emptyempty (
$tablename
)) { <br>
if
(@mysql_num_rows(mysql_query(
"SHOW TABLES LIKE '"
.
$tablename
.
"'"
)) == 1) { <br>
}
else
{ <br>
$this
->_showMsg(
'表-<b>'
.
$tablename
.
'</b>-不存在,请检查!'
,true); <br>
die
(); <br>
} <br>
$this
->_showMsg(
'正在备份表 <span>'
.
$tablename
.
'</span>'
); <br>
$sql
=
$this
->_retrieve (); <br>
$sql
.=
$this
->_insert_table_structure (
$tablename
); <br>
$data
= mysql_query (
"select * from "
.
$tablename
); <br>
$filename
=
date
(
'YmdHis'
) .
"_"
.
$tablename
; <br>
$num_fields
= mysql_num_fields (
$data
); <br>
$p
= 1; <br>
while
(
$record
= mysql_fetch_array (
$data
) ) { <br>
$sql
.=
$this
->_insert_record (
$tablename
,
$num_fields
,
$record
); <br>
if
(
strlen
(
$sql
) >=
$size
* 1024) { <br>
$file
=
$filename
.
"_v"
.
$p
.
".sql"
; <br>
if
(
$this
->_write_file (
$sql
,
$file
,
$dir
)) { <br>
$this
->_showMsg(
"表-<b>"
.
$tablename
.
"</b>-卷-<b>"
.
$p
.
"</b>-数据备份完成,备份文件 [ <span>"
.
$dir
.
$file
.
"</span> ]"
); <br>
}
else
{ <br>
$this
->_showMsg(
"备份表 -<b>"
.
$tablename
.
"</b>- 失败"
,true); <br>
return
false; <br>
} <br>
$p
++; <br>
$sql
=
""
; <br>
} <br>
} <br>
unset(
$data
,
$record
); <br>
if
(
$sql
!=
""
) { <br>
$filename
.=
"_v"
.
$p
.
".sql"
; <br>
if
(
$this
->_write_file (
$sql
,
$filename
,
$dir
)) { <br>
$this
->_showMsg(
"表-<b>"
.
$tablename
.
"</b>-卷-<b>"
.
$p
.
"</b>-数据备份完成,备份文件 [ <span>"
.
$dir
.
$filename
.
"</span> ]"
); <br>
}
else
{ <br>
$this
->_showMsg(
"备份卷-<b>"
.
$p
.
"</b>-失败<br>"
); <br>
return
false; <br>
} <br>
} <br>
$this
->_showMsg(
"恭喜您! <span>备份成功</span>"
); <br>
}
else
{ <br>
$this
->_showMsg(
'正在备份'
); <br>
if
(
$tables
= mysql_query (
"show table status from "
.
$this
->database )) { <br>
$this
->_showMsg(
"读取数据库结构成功!"
); <br>
}
else
{ <br>
$this
->_showMsg(
"读取数据库结构失败!"
); <br>
exit
( 0 ); <br>
} <br>
$sql
.=
$this
->_retrieve (); <br>
$filename
=
date
(
'YmdHis'
) .
"_all"
; <br>
$tables
= mysql_query (
'SHOW TABLES'
); <br>
$p
= 1; <br>
while
(
$table
= mysql_fetch_array (
$tables
) ) { <br>
$tablename
=
$table
[0]; <br>
$sql
.=
$this
->_insert_table_structure (
$tablename
); <br>
$data
= mysql_query (
"select * from "
.
$tablename
); <br>
$num_fields
= mysql_num_fields (
$data
); <br>
<br>
while
(
$record
= mysql_fetch_array (
$data
) ) { <br>
$sql
.=
$this
->_insert_record (
$tablename
,
$num_fields
,
$record
); <br>
if
(
strlen
(
$sql
) >=
$size
* 1000) { <br>
<br>
$file
=
$filename
.
"_v"
.
$p
.
".sql"
; <br>
if
(
$this
->_write_file (
$sql
,
$file
,
$dir
)) { <br>
$this
->_showMsg(
"-卷-<b>"
.
$p
.
"</b>-数据备份完成,备份文件 [ <span>"
.
$dir
.
$file
.
"</span> ]"
); <br>
}
else
{ <br>
$this
->_showMsg(
"卷-<b>"
.
$p
.
"</b>-备份失败!"
,true); <br>
return
false; <br>
} <br>
$p
++; <br>
$sql
=
""
; <br>
} <br>
} <br>
} <br>
if
(
$sql
!=
""
) { <br>
$filename
.=
"_v"
.
$p
.
".sql"
; <br>
if
(
$this
->_write_file (
$sql
,
$filename
,
$dir
)) { <br>
$this
->_showMsg(
"-卷-<b>"
.
$p
.
"</b>-数据备份完成,备份文件 [ <span>"
.
$dir
.
$filename
.
"</span> ]"
); <br>
}
else
{ <br>
$this
->_showMsg(
"卷-<b>"
.
$p
.
"</b>-备份失败"
,true); <br>
return
false; <br>
} <br>
} <br>
$this
->_showMsg(
"恭喜您! <span>备份成功</span>"
); <br>
} <br>
} <br>
<br>
private
function
_showMsg(
$msg
,
$err
=false){ <br>
$err
=
$err
?
"<span>ERROR:</span>"
:
''
; <br>
echo
"<p>"
.
$err
.
$msg
.
"</p>"
; <br>
flush
(); <br>
<br>
} <br>
<br>
<br>
private
function
_retrieve() { <br>
$value
=
''
; <br>
$value
.=
'--'
.
$this
->ds; <br>
$value
.=
'-- MySQL database dump'
.
$this
->ds; <br>
$value
.=
'-- Created by DbManage class, Power By yanue. '
.
$this
->ds; <br>
$value
.=
'-- http://yanue.net '
.
$this
->ds; <br>
$value
.=
'--'
.
$this
->ds; <br>
$value
.=
'-- 主机: '
.
$this
->host .
$this
->ds; <br>
$value
.=
'-- 生成日期: '
.
date
(
'Y'
) .
' 年 '
.
date
(
'm'
) .
' 月 '
.
date
(
'd'
) .
' 日 '
.
date
(
'H:i'
) .
$this
->ds; <br>
$value
.=
'-- MySQL版本: '
. mysql_get_server_info () .
$this
->ds; <br>
$value
.=
'-- PHP 版本: '
. phpversion () .
$this
->ds; <br>
$value
.=
$this
->ds; <br>
$value
.=
'--'
.
$this
->ds; <br>
$value
.=
'-- 数据库: `'
.
$this
->database .
'`'
.
$this
->ds; <br>
$value
.=
'--'
.
$this
->ds .
$this
->ds; <br>
$value
.=
'-- -------------------------------------------------------'
; <br>
$value
.=
$this
->ds .
$this
->ds; <br>
return
$value
; <br>
} <br>
<br>
<br>
private
function
_insert_table_structure(
$table
) { <br>
$sql
=
''
; <br>
$sql
.=
"--"
.
$this
->ds; <br>
$sql
.=
"-- 表的结构"
.
$table
.
$this
->ds; <br>
$sql
.=
"--"
.
$this
->ds .
$this
->ds; <br>
<br>
$sql
.=
"DROP TABLE IF EXISTS `"
.
$table
.
'`'
.
$this
->sqlEnd .
$this
->ds; <br>
$res
= mysql_query (
'SHOW CREATE TABLE `'
.
$table
.
'`'
); <br>
$row
= mysql_fetch_array (
$res
); <br>
$sql
.=
$row
[1]; <br>
$sql
.=
$this
->sqlEnd .
$this
->ds; <br>
$sql
.=
$this
->ds; <br>
$sql
.=
"--"
.
$this
->ds; <br>
$sql
.=
"-- 转存表中的数据 "
.
$table
.
$this
->ds; <br>
$sql
.=
"--"
.
$this
->ds; <br>
$sql
.=
$this
->ds; <br>
return
$sql
; <br>
} <br>
<br>
<br>
private
function
_insert_record(
$table
,
$num_fields
,
$record
) { <br>
$insert
=
''
; <br>
$comma
=
""
; <br>
$insert
.=
"INSERT INTO `"
.
$table
.
"` VALUES("
; <br>
for
(
$i
= 0;
$i
$insert
.= (
$comma
.
"'"
. mysql_escape_string (
$record
[
$i
] ) .
"'"
); <br>
$comma
=
","
; <br>
} <br>
$insert
.=
");"
.
$this
->ds; <br>
return
$insert
; <br>
} <br>
<br>
<br>
private
function
_write_file(
$sql
,
$filename
,
$dir
) { <br>
$dir
=
$dir
?
$dir
:
'./backup/'
; <br>
if
(!
is_dir
(
$dir
)) { <br>
mkdir
(
$dir
, 0777, true ); <br>
} <br>
$re
= true; <br>
if
(! @
$fp
=
fopen
(
$dir
.
$filename
,
"w+"
)) { <br>
$re
= false; <br>
$this
->_showMsg(
"打开sql文件失败!"
,true); <br>
} <br>
if
(! @fwrite (
$fp
,
$sql
)) { <br>
$re
= false; <br>
$this
->_showMsg(
"写入sql文件失败,请文件是否可写"
,true); <br>
} <br>
if
(! @fclose (
$fp
)) { <br>
$re
= false; <br>
$this
->_showMsg(
"关闭sql文件失败!"
,true); <br>
} <br>
return
$re
; <br>
} <br>
<br>
<br>
<br>
<br>
function
restore(
$sqlfile
) { <br>
if
(!
file_exists
(
$sqlfile
)) { <br>
$this
->_showMsg(
"sql文件不存在!请检查"
,true); <br>
exit
(); <br>
} <br>
$this
->lock (
$this
->database ); <br>
$sqlpath
=
pathinfo
(
$sqlfile
); <br>
$this
->sqldir =
$sqlpath
[
'dirname'
]; <br>
$volume
=
explode
(
"_v"
,
$sqlfile
); <br>
$volume_path
=
$volume
[0]; <br>
$this
->_showMsg(
"请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损"
); <br>
$this
->_showMsg(
"正在导入备份数据,请稍等!"
); <br>
if
(emptyempty (
$volume
[1] )) { <br>
$this
->_showMsg (
"正在导入sql:<span>"
.
$sqlfile
.
'</span>'
); <br>
if
(
$this
->_import (
$sqlfile
)) { <br>
$this
->_showMsg(
"数据库导入成功!"
); <br>
}
else
{ <br>
$this
->_showMsg(
'数据库导入失败!'
,true); <br>
exit
(); <br>
} <br>
}
else
{ <br>
$volume_id
=
explode
(
".sq"
,
$volume
[1] ); <br>
$volume_id
=
intval
(
$volume_id
[0] ); <br>
while
(
$volume_id
) { <br>
$tmpfile
=
$volume_path
.
"_v"
.
$volume_id
.
".sql"
; <br>
if
(
file_exists
(
$tmpfile
)) { <br>
$this
->msg .=
"正在导入分卷 $volume_id :<span>"
.
$tmpfile
.
'</span><br>'
; <br>
if
(
$this
->_import (
$tmpfile
)) { <br>
<br>
}
else
{ <br>
$volume_id
=
$volume_id
?
$volume_id
:1; <br>
exit
(
"导入分卷:<span>"
.
$tmpfile
.
'</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入'
); <br>
} <br>
}
else
{ <br>
$this
->msg .=
"此分卷备份全部导入成功!<br>"
; <br>
return
; <br>
} <br>
$volume_id
++; <br>
} <br>
}
if
(emptyempty (
$volume
[1] )) { <br>
$this
->_showMsg (
"正在导入sql:<span>"
.
$sqlfile
.
'</span>'
); <br>
if
(
$this
->_import (
$sqlfile
)) { <br>
$this
->_showMsg(
"数据库导入成功!"
); <br>
}
else
{ <br>
$this
->_showMsg(
'数据库导入失败!'
,true); <br>
exit
(); <br>
} <br>
}
else
{ <br>
$volume_id
=
explode
(
".sq"
,
$volume
[1] ); <br>
$volume_id
=
intval
(
$volume_id
[0] ); <br>
while
(
$volume_id
) { <br>
$tmpfile
=
$volume_path
.
"_v"
.
$volume_id
.
".sql"
; <br>
if
(
file_exists
(
$tmpfile
)) { <br>
$this
->msg .=
"正在导入分卷 $volume_id :<span>"
.
$tmpfile
.
'</span><br>'
; <br>
if
(
$this
->_import (
$tmpfile
)) { <br>
<br>
}
else
{ <br>
$volume_id
=
$volume_id
?
$volume_id
:1; <br>
exit
(
"导入分卷:<span>"
.
$tmpfile
.
'</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入'
); <br>
} <br>
}
else
{ <br>
$this
->msg .=
"此分卷备份全部导入成功!<br>"
; <br>
return
; <br>
} <br>
$volume_id
++; <br>
} <br>
} <br>
} <br>
<br>
<br>
private
function
_import(
$sqlfile
) { <br>
$sqls
=
array
(); <br>
$f
=
fopen
(
$sqlfile
,
"rb"
); <br>
$create_table
=
''
; <br>
while
( !
feof
(
$f
) ) { <br>
$line
=
fgets
(
$f
); <br>