<?php
// ========================== 文件說明 ==========================//
// 進行簡單備份和恢復功能
/*
所謂備份功能就是指
1, 備份就是一個文件,沒有什麼其它的選項, 帶來的效果就是使用簡單
2, 沒有分卷功能,分卷在有些windows虛擬主機中,不能導入大於2M的文件
3, 不能備份單張表,只能全部備份,單張表在只更改一些程序功能是蠻好用的
我這裡的功能就是點備分就是備份一個文件,以日期為.sql文件
*/
header("content-type:text/html;charset=utf-8");
// --------------- 配置 -----------------
/*
$h='localhost'; //主機
$u='root'; //用戶名
$p=''; //密碼
$db='mall'; //數據庫名
*/
include('config.php');
$backup_dir = './static/sql/'; //保存目錄
// --------------- 程序 -----------------
//$c = db($h, $u, $p, $db); //新建連接
$c = db(DB_HOST, DB_USER, DB_PASS, DB_NAME); //新建連接
// Main
$action = strtolower(trim($_GET['action']));
// 功能
function db($h='localhost', $u='', $p='', $db=''){
$c = mysql_connect($h, $u, $p) or die('連接服務器失敗.');
mysql_select_db($db, $c) or dir('無法打開數據庫');
mysql_query('SET NAMES GBK', $c);
return $c;
}
//產生列表
if ($action == '') {
$h = opendir($backup_dir);
echo "<ul>";
while($f = readdir($h)){
if (eregi("^[0-9]{8,8}([0-9a-z_]+)(\.sql)$", $f))
echo "<li>$f <a href='db.php?action=remove&f=$f'>刪除</a> | <a href='db.php?action=restore&f=$f'>恢復</a></li>";
}
closedir($h);
echo "<li>$f <a href='db.php?action=backup'>新建備份</a>";
echo "</ul>";
}
//刪除
if ($action == 'remove'){
$f = $_GET['f'];
if (!empty($f)) {
unlink($backup_dir.$f);
echo "刪除成功";
echo "<a href=db.php>返回</a>";
}
}
//恢復
if ($action == 'restore'){
$f = $_GET['f'];
if (!empty($f)) {
//導入數據
$fa = $backup_dir.$f;
$sqls = file($fa);
foreach($sqls as $sql) {
$sql = str_replace("\r","",$sql);
$sql = str_replace("\n","",$sql);
mysql_query($sql, $c);
}
echo "導入成功<a href=db.php>返回</a>";
}
}
//備份
if ($action == 'backup') {
$q = mysql_query("SHOW TABLE STATUS", $c) or die("讀數據庫結構錯誤");
//建成sql
$sql=""; //清空sql
while($r = mysql_fetch_array($q, MYSQL_ASSOC)) {
//產生表頭
$sql .= "DROP TABLE IF EXISTS ".$r['Name']."\n";
$q1 = mysql_query("SHOW CREATE TABLE ".$r['Name'], $c);
$q2 = mysql_fetch_row($q1);
$sql .= preg_replace("/\n/", "", $q2[1]) ."\n";
//產生表內容
$q3 = mysql_query("SELECT * FROM {$r['Name']}", $c);
$nf = mysql_num_fields($q3);
while($r2=mysql_fetch_array($q3, MYSQL_NUM)) { //產生數字段格式的數組
$comma = "";
$sql.="INSERT INTO ".$r['Name']." VALUES(";
for ($i=0; $i<$nf; $i++) {
$sql .= $comma."'".mysql_escape_string($r2[$i])."'";
//$sql .= $comma."'".addslashes($r2[$i])."'";
$comma = ",";
}
$sql .= ")\n";
}
}
//寫入文件
$fa = date("Ymd", time())."_all.sql";
$fp = fopen($backup_dir.$fa, 'w+') or die("Failed to open target file");
fwrite($fp, $sql) or die ("failed to write file");
fclose($fp);
echo "備份完成,生成備份文件'$fa'";
echo "<a href=db.php>返回</a>";
}
mysql_close($c); //關閉連接
?>