📄 backup.class.php
字号:
<?
define ('_CONNECTION_ERROR_',"DB Connection error.");
class backup extends db{
var $backupdir = "backup";
var $compression = "bz2";
var $color1 = "#FFFF99";
var $color2 = "#CCCCFF";
var $color3 = "#FFFFFF";
var $mysqldump = true;
var $default_sort_order = "DateDesc";
var $file_mod = "0777";
function backup(){
global $GonxAdmin;
$this->compression = $GonxAdmin["compression_default"];
}
function tables_menu(){
global $GONX;
$color3 = $this->color3;
$color2 = $this->color2;
$color1 = $this->color1;
$res = "\n<form action='?go=backuptables' method='post'>
<table width=500 cellpadding=\"3\" style=\"border-collapse: collapse; border: 1px solid #666699; padding-left: 4; padding-right: 4; padding-top: 1; padding-bottom: 1\">
<tr bgcolor=\"$color1\">
<th width=150 align=left> <font face=arial size=2>Table</font></th>
<th width=50 align=center><font face=arial size=2>Rows</font></th>
<th width=70 align=center><font face=arial size=2> Create_time</font></th>
<th width=70 align=center><font face=arial size=2> Update_time</font></th>
<th width=70 align=center><font face=arial size=2> Check_time</font></th>
</tr>\n\n";
$result = $this->query('SHOW TABLE STATUS');
$i = 0; $bgcolor = $color2;
while ($table = @$this->fetch_array($result)) {
if ($table["Update_time"]!=$table["Create_time"]) {
$l1 = "<label for=\"tables$i\">";
$l2 = "</label>";
} else {
$l1 = $l2 = "";
};
$res .= "<tr bgcolor=\"$bgcolor\">
<th align=left><input type='checkbox' id='tables$i' name='tables[]' value='".$table["Name"]."' /> <font face=\"Verdana\" size=1 color=#006600><b>".strtoupper($table["Name"])."</b></font></th>
<td align=center><font face=Verdana size=1 color=#006600>".$table["Rows"]."</font></td>
<td align=center><font face=Verdana size=1 color=#006600>$l1".$table["Create_time"]."$l2</font></td>
<td align=center><font face=Verdana size=1 color=#006600>$l1".$table["Update_time"]."$l2</font></td>
<td align=center><font face=Verdana size=1 color=#006600>".$table["Check_time"]."</font></td>
</tr>";
if ($bgcolor==$color3) {
$bgcolor = $color2;
} else $bgcolor = $color3;
$i++;
}
$res .= "</table><br> <input type='checkbox' name='structonly' value='Yes'><font face=arial size=2> Only backup table structure</font><br><br>
<p align=left><input type='submit' value='Backup DB'></p></form><br><br><br><br><br><br>";
return $res;
}
function tables_backup($tables,$structonly){
global $GONX;
foreach($tables as $v){
$res = $this-> query("SHOW CREATE TABLE " . $this -> dbName . "." .$v);
while ($resu[] = $this -> get_data()) {
}
}
foreach($resu as $key => $val) {
$tbl_name_status = $this->valid_table_name($val[0]);
if (trim($val[0]) !== "" and $tbl_name_status) {
$Dx_Create_Tables .= "
# Drop table '" . $val[0] . "' if exist
<xquery>
DROP TABLE IF EXISTS " . $val[0] . ";
</xquery>
# create table '" . $val[0] . "'
<xquery>
" . $val[1] . " ;
</xquery>\r\n";
if ($structonly!="Yes") {
$query = "Insert into `$val[0]` (";
$this -> query("LOCK TABLES $val[0] WRITE");
$qresult = $this -> query("Select * from $val[0]");
while ($line = $this -> fetch_array($qresult)) {
unset($fields, $values);
$j = 0;
while (list($col_name, $col_value) = each($line)) {
if (!is_int($col_name)) {
$fields .= "`$col_name`,";
$values .= "'" . $this->escape_string($col_value) . "',";
}
}
$fields = substr($fields, 0, strlen($fields)-1);
$values = substr($values, 0, strlen($values)-1);
$myquery = $query . $fields . ") values (" . $values . ");";
$Dx_Create_Tables .= "\r\n<xquery>
" . $myquery . "
</xquery>\r\n" ;
}
$this -> query("UNLOCK TABLES;");
}
} elseif (!$tbl_name_status){
$err_msg .= "<font color=red>".$GONX["ignoredtables"]." ".$val[0]." - ".$GONX["reservedwords"].".</font><br>\n";
}
}
if (!is_dir($this->backupdir)) {
@mkdir($this->backupdir,0755);
}
if (sizeof($tables)==1) {
$prefix = "[".$tables[0]."]";
} else $prefix = "[".sizeof($tables)."tables]";
switch($this->compression){
case "bz2":
$fname = $this->dbName."-$prefix-".date("Y-m-d H-i-s").".bz2";
touch($this->backupdir."/".$fname);
$fp = bzopen($this->backupdir."/".$fname, "w");
bzwrite($fp, $Dx_Create_Tables);
bzclose($fp);
break;
case "zlib":
$fname = $this->dbName."-$prefix-".date("Y-m-d H-i-s").".gz";
touch($this->backupdir."/".$fname);
$fp = gzopen($this->backupdir."/".$fname, "w");
gzwrite($fp, $Dx_Create_Tables);
gzclose($fp);
break;
default:
$fname = $this->dbName."-$prefix-".date("Y-m-d H-i-s").".sql";
touch($this->backupdir."/".$fname);
$fp = fopen($this->backupdir."/".$fname, "w");
fwrite($fp, $Dx_Create_Tables);
fclose($fp);
break;
}
return "<font color=red>$err_msg".$GONX["backup"]." ".$this->dbName." ".$GONX["iscorrectcreat"]." : ".$this->backupdir."/$fname</font>";
}
function generate(){
global $GONX;
$result = @$this->list_tables($this->dbName);
while ($table = @$this->fetch_row($result)) {
$res = $this-> query("SHOW CREATE TABLE " . $this -> dbName . "." . $table[0]);
while ($resu[] = $this -> get_data()) {
}
}
foreach($resu as $key => $val) {
$tbl_name_status = $this->valid_table_name($val[0]);
if (trim($val[0]) !== "" and $tbl_name_status) {
$Dx_Create_Tables .= "
# Drop table '" . $val[0] . "' if exist
<xquery>
DROP TABLE IF EXISTS " . $val[0] . ";
</xquery>
# create table '" . $val[0] . "'
<xquery>
" . $val[1] . " ;
</xquery>\r\n";
$query = "Insert into `$val[0]` (";
$this -> query("LOCK TABLES $val[0] WRITE");
$qresult = $this -> query("Select * from $val[0]");
while ($line = $this -> fetch_array($qresult)) {
unset($fields, $values);
$j = 0;
while (list($col_name, $col_value) = each($line)) {
if (!is_int($col_name)) {
$fields .= "`$col_name`,";
$values .= "'" . $this->escape_string($col_value) . "',";
}
}
$fields = substr($fields, 0, strlen($fields)-1);
$values = substr($values, 0, strlen($values)-1);
$myquery = $query . $fields . ") values (" . $values . ");";
$Dx_Create_Tables .= "\r\n<xquery>
" . $myquery . "
</xquery>\r\n" ;
}
$this -> query("UNLOCK TABLES;");
} elseif (!$tbl_name_status){
$err_msg .= "<font color=red>Ignored table ".$val[0]." - Reserved SQL word.</font><br>\n";
}
}
if (!is_dir($this->backupdir)) {
@mkdir($this->backupdir,octdec($this->file_mod));
}
switch($this->compression){
case "bz2":
$fname = $this->dbName."-".date("Y-m-d H-i-s").".bz2";
touch($this->backupdir."/".$fname);
$fp = bzopen($this->backupdir."/".$fname, "w");
bzwrite($fp, $Dx_Create_Tables);
bzclose($fp);
break;
case "zlib":
$fname = $this->dbName."-".date("Y-m-d H-i-s").".gz";
touch($this->backupdir."/".$fname);
$fp = gzopen($this->backupdir."/".$fname, "w");
gzwrite($fp, $Dx_Create_Tables);
gzclose($fp);
break;
default:
$fname = $this->dbName."-".date("Y-m-d H-i-s").".sql";
touch($this->backupdir."/".$fname);
$fp = fopen($this->backupdir."/".$fname, "w");
fwrite($fp, $Dx_Create_Tables);
fclose($fp);
break;
}
return "<font color=red>$err_msg".$GONX["backup"]." ".$this->dbName." ".$GONX["iscorrectcreat"]." : ".$this->backupdir."/$fname</font>";
}
function import($bfile = ""){
global $GONX,$GonxAdmin;
set_time_limit(0);
if (isset($_GET["importdump"])) {
if (is_file($this->backupdir."/".$bfile)) {
switch($GonxAdmin["compression_default"]){
case "bz2":
$bz = bzopen($this->backupdir."/".$bfile, "r");
while (!feof($bz)) {
$contents .= bzread($bz, 4096);
}
bzclose($bz);
break;
case "zlib":
$bz = gzopen($this->backupdir."/".$bfile, "r");
$contents = gzread($bz, filesize($this->backupdir."/".$bfile)*1000); // just a hack coz feof doesn't wrk for me
gzclose($bz);
break;
default:
$bz = fopen($this->backupdir."/".$bfile, "r");
$contents = fread($bz, filesize($this->backupdir."/".$bfile)*1000); // just a hack coz feof doesn't wrk for me
fclose($bz);
break;
}
$contents = str_replace("<xquery>", "", $contents);
$contents = str_replace("</xquery>", "", $contents);
touch($this->backupdir."/temp.sql");
$fp = fopen($this->backupdir."/temp.sql", "w");
fwrite($fp, $contents);
fclose($fp); unset($contents);
@shell_exec($GonxAdmin["mysqldump"]." --host ".$GonxAdmin["dbhost"]." --user=".$GonxAdmin["dbuser"]." --pass=".$GonxAdmin["dbpass"]." --databases ".$GonxAdmin["dbname"]." < ".$this->backupdir."/temp.sql");
@unlink($this->backupdir."/temp.sql");
return "<font color=red> $bfile ".$GONX["iscorrectimport"]." </font>";
} else return FALSE;
}
if (is_file($this->backupdir."/".$bfile)) { // File existe, import it
switch($GonxAdmin["compression_default"]){
case "bz2":
$bz = bzopen($this->backupdir."/".$bfile, "r");
while (!feof($bz)) {
$contents .= bzread($bz, 4096);
}
bzclose($bz);
break;
case "zlib":
$bz = gzopen($this->backupdir."/".$bfile, "r");
$contents = gzread($bz, filesize($this->backupdir."/".$bfile)*1000);
gzclose($bz);
break;
default:
$bz = fopen($this->backupdir."/".$bfile, "r");
$contents = fread($bz, filesize($this->backupdir."/".$bfile)*1000);
break;
}
preg_match_all("'<xquery[?>]*?>(.*?)</xquery>'si" , $contents, $requetes);
unset($contents);
foreach($requetes[1] as $key => $val) {
$this -> query(trim($val));
}
return "<font color=red> $bfile ".$GONX["iscorrectimport"]." </font>";
} else {
return false;
}
}
function importfromfile(){
global $GONX,$HTTP_POST_FILES;
@set_time_limit(0);
$bfile = $HTTP_POST_FILES["backupfile"];
$pathinfo = pathinfo($bfile["name"]);
$compression = $pathinfo["extension"];
if ($bfile["error"]==0) { // File existe, import it
switch($compression){
case "bz2":
$bz = bzopen($bfile["tmp_name"], "r");
$contents = bzread($bz, $bfile["size"]);
bzclose($bz);
break;
case "gz":
$gz = gzopen($bfile["tmp_name"], "r");
$contents = gzread($gz, $bfile["size"]);
bzclose($gz);
break;
default:
$f = fopen($bfile["tmp_name"], "r");
$contents = fread($f, $bfile["size"]);
fclose($f);
break;
}
preg_match_all("'<xquery[?>]*?>(.*?)</xquery>'si" , $contents, $requetes);
foreach($requetes[1] as $key => $val) {
$this -> query(trim($val));
}
return "<font color=red> ".$bfile["name"]." ".$GONX["iscorrectimport"]." </font>";
} else { // Erronous file, read dir, and list available backup file.
return $this->listbackups();
}
}
/**
* backup::listbackups() List available backup
*
* @return
**/
function listbackups(){
global $GONX,$GonxAdmin,$page,$orderby;
$pagesize = $GonxAdmin["pagedisplay"];
$GonxOrder = array("Date_Descending","Date_Ascending","Name_Descending","Name_Ascending","Size_Descending","Size_Ascending");
if ($orderby=="" or !in_array($orderby,$GonxOrder )) {
$orderby = $this->default_sort_order;
}
if( !isset( $page ) or ($page<=0) ){
$page = 1;
$from = $page-1;
$to = ($pagesize*$page);
} elseif ($page ==1){
$from = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -