Скрипт будет выдавать ошибку времени исполнения при большом объеме базы. Во избежание этого нужно рекурсивно вызывать скрипт, но еще не придумал как.
Если укажите на ошибки буду только рад. Скрипт естественно несовершенен.
Если укажите на ошибки буду только рад. Скрипт естественно несовершенен.
<?php
$tmp_backup_cfg = "backup_config.dat";
$backup_cfg = "backup_cfg.php";
$parse = "////\n";
chdir(dirname($_SERVER['PHP_SELF'])."/");
function structuredb(){
require_once("backup_cnt.php");
$struct_db = "structure_".$backup_dbname.".dat"; // файл структуры БД
if (file_exists($struct_db)) unlink($struct_db);
$fp = fopen($struct_db,"a+");
$tables = mysql_list_tables($backup_dbname); // список таблиц
while ($table = mysql_fetch_row($tables)) { // перебор таблиц
//if ($table[0] != "rusfusion_aw_ec_logins") {
$fields = mysql_list_fields($backup_dbname,$table[0]); // список полей таблицы
$count_fields = mysql_num_fields($fields); // количество полей
fwrite($fp,"\nTable: ".$table[0]."\n");
for ($i = 0; $i < $count_fields; $i++){ // перебор полей
$name_fields = mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
$type_fields = mysql_field_type($fields, $i);
$len_fields = mysql_field_len($fields, $i);
$flag_fields = mysql_field_flags($fields, $i);
$name_field = mysql_field_name($fields, $i); // вывод шапки таблицы (имена полей)
fwrite($fp,"Field: $name_fields | $type_fields | $len_fields | $flag_fields\n");
} // END FOR #1
//}//ENDIF
} // END WHILE #1
fclose($fp);
$content = "Save structure db $backup_dbname - complite.";
$fo = fopen($struct_db,"r");
$content .= "Структура БД: $backup_dbname
";
$data = fread($fo,filesize($struct_db));
$data = str_replace("\n","
",$data);
$data = str_replace("Table:","Table:",$data);
$data = str_replace("Field:","    Field:",$data);
fclose($fo);
$content .= $data;
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
";
return $content; //"Function Structure DB";
}
function copydb($parse,$start){
require_once("backup_cnt.php");
$content = "";
$dirdata = "database";
if (!file_exists($dirdata) || !is_dir($dirdata)) mkdir($dirdata);
$tables = mysql_list_tables($backup_dbname); // список таблиц
while ($table = mysql_fetch_row($tables)){ // перебор таблиц
$fields = mysql_list_fields($backup_dbname,$table[0]); // список полей таблицы
$count_fields = mysql_num_fields($fields); // количество полей
$name_fields = "";
for ($i = 0; $i < $count_fields; $i++){ // перебор полей
$name_fields[] .= mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
} // END FOR #1
$sql_count = mysql_query("SELECT count(*) AS c FROM ".$table[0]);
$count_str = mysql_result($sql_count,'c');
/**Нужно рекурсивно вызывать скрипт с заданным началом отсчета. А вход в функцию по переменной в адресе!**/
if ($count_str > 500){
$count = 500;
if (empty($start)) $start = 0; else $start = intval($start);
$file = $table[0].".dat";
if (file_exists($dirdata."/".$file)) unlink($dirdata."/".$file);
$fo = fopen($dirdata."/".$file,"a");
if ($count_str > $start+$count){
$sql = mysql_query("SELECT * FROM ".$table[0]." LIMIT $start, $count"); // выборка
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
$start =+ $count;
//header("Location: backup.php?s=$start");
//die();
} // END WHILE #1
if ($count_str > $start){ // Копируем остаток таблицы
$count = $count_str - $start;
$sql = mysql_query("SELECT * FROM ".$table[0]." LIMIT $start, $count"); // выборка
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
}
fclose($fo);
$content .= "Table ".$table[0]." ($count_str) - complite.<br>";
} else {
$sql = mysql_query("SELECT * FROM ".$table[0]); // выборка
$file = $table[0].".dat";
if (file_exists($dirdata."/".$file)) unlink($dirdata."/".$file);
$fo = fopen($dirdata."/".$file,"a");
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
fclose($fo);
$content .= "Table ".$table[0]." ($i) - complite.<br>";
} // if >5000
} // END WHILE #1
global $backup_cfg;
unlink($backup_cfg);
return $content;
}
function sendmail(){
$boundary = "--".md5(uniqid(time()));
$headers = "From: My site<noreply@example.com>\r\n";
$headers .= "Reply-To: mail@example.com\r\n";
$headers .= "Return-Path: mail@example.com\r\n";
$headers .= "X-Mailer: Example\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$kod = 'windows-1251';
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "Резервная копия\n\n";
global $backup_dbname;
$path = "structure_".$backup_dbname.".dat";
if (file_exists($path)){
$fp = fopen($path,"r");
if ($fp){
$file = fread($fp,filesize($path));
fclose($fp);
$message_part = "";
$message_part .= "Content-Type: application/octet-stream";
$message_part .= "; name = \"$path\"\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n\n";
$multipart .= "--$boundary\n".$message_part;
unlink($path);
}
}
$database = opendir("database/");
while ($filename = readdir($database)){
$ftype = filetype("database/".$filename);
if ($ftype != "dir" && preg_match("#.dat$#D",$filename)){
$path = "database/".$filename;
$fp = fopen($path,"r");
if ($fp){
if (filesize($path) == 0) $file = "";
else $file = fread($fp,filesize($path));
fclose($fp);
$message_part = "Content-Type: application/octet-stream";
$message_part .= "; name = \"$filename\"\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n\n";
$multipart .= "--$boundary\n".$message_part;
unlink($path);
} // END IF #2
}
} // END WHILE
$multipart .= "--$boundary--\n";
if (mail("mail@example.com","BackUp",$multipart,$headers))
return "Сообщение отправлено.";
else return "Ошибка отправки.";
}
$content = "
Резервное копирование
";
if (file_exists($backup_cfg)) require_once($backup_cfg);
/**** Не работает ****/
if (isset($_GET['s']) && !empty($_GET['s'])){
$content .= copydb($parse,$_GET['s']);
}
if (isset($_POST['nextstep'])){
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);
} elseif (isset($_POST['deleteconfig'])){
unlink($backup_cfg);
header("Refresh: 0;");
} elseif (isset($_POST['servername']) && isset($_POST['inputserver']) && !empty($_POST['servername'])){
$backup_fp = fopen($tmp_backup_cfg,"w");
$backup_server = $_POST['servername'];
fwrite($backup_fp,$backup_server);
fclose($backup_fp);
header("Refresh: 0;");
} elseif (file_exists($tmp_backup_cfg)){
if (isset($_POST['logindb']) && isset($_POST['passdb']) && isset($_POST['inputauth']) && !empty($_POST['logindb'])){
$backup_fp = fopen($tmp_backup_cfg,"a");
$backup_lp = $_POST['logindb']."\n".$_POST['passdb'];
fwrite($backup_fp,"\n".$backup_lp);
fclose($backup_fp);
header("Refresh: 0;");
} elseif (isset($_POST['namedb']) && isset($_POST['selectdb']) && !empty($_POST['namedb'])){
$backup_fp = fopen($tmp_backup_cfg,"a");
fwrite($backup_fp,"\n".$_POST['namedb']);
fclose($backup_fp);
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_str = explode("\n",$backup_data);
$backup_servername = $backup_str[0];
$backup_login = $backup_str[1];
$backup_password = $backup_str[2];
$backup_dbname = $backup_str[3];
$backup_fp = fopen($backup_cfg,"w");
$backup_write = '<?php'."\n".'$backup_servername = "'.$backup_servername.'";'."\n".'$backup_login = "'.$backup_login.'";'."\n".'$backup_password = "'.$backup_password.'";'."\n".'$backup_dbname = "'.$backup_dbname.'";'."\n".'?>';
fwrite($backup_fp,$backup_write);
fclose($backup_fp);
unlink($tmp_backup_cfg);
if (isset($_POST['struct'])) $content .= structuredb();
else {
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);
}
} else {
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_count_str = count(explode("\n",$backup_data));
if ($backup_count_str == 3){
$backup_data = explode("\n",$backup_data);
$backup_servername = $backup_data[0];
$backup_login = $backup_data[1];
$backup_password = $backup_data[2];
$backup_conn = @mysql_connect($backup_servername,$backup_login,$backup_password);
if (!$backup_conn){
unlink($tmp_backup_cfg);
header("Refresh: 5;");
die("Could not connect: Неверный логин или пароль. Страница перезагрузится автоматически через 5 секунд.");
}
$backup_dbs = @mysql_list_dbs($backup_conn);
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
База Данных для копирования:
--";
while ($backup_db_name = mysql_fetch_object($backup_dbs)){
$content .= "
<option value='".$backup_db_name->Database."'"; if(isset($backup_dbname) && $backup_db_name->Database == $backup_dbname) $content .= " selected"; $content .= ">".$backup_db_name->Database."";
}
$content .= "
Копировать структуру базы.
";
} elseif ($backup_count_str == 1){
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
Логин:
Пароль:
";
} elseif ($backup_count_str == 3){
$backup_fp = fopen($tmp_backup_cfg,"a");
fwrite($backup_fp,"\n".$_POST['namedb']);
fclose($backup_fp);
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_str = explode("\n",$backup_data);
$backup_servername = $backup_str[0];
$backup_login = $backup_str[1];
$backup_password = $backup_str[2];
$backup_dbname = $backup_str[3];
$backup_fp = fopen($backup_cfg,"w");
$backup_write = '<?php'."\n".'$backup_servername = "'.$backup_servername.'";'."\n".'$backup_login = "'.$backup_login.'";'."\n".'$backup_password = "'.$backup_password.'";'."\n".'$backup_dbname = "'.$backup_dbname.'";'."\n".'?>';
fwrite($backup_fp,$backup_write);
fclose($backup_fp);
unlink($tmp_backup_cfg);
if (isset($_POST['struct'])) $content .= structuredb();
else {
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);
}
} else {
unlink($tmp_backup_cfg);
if (file_exists($backup_cfg)) unlink($backup_cfg);
header("Refresh: 0;");
}
}
} else {
if (file_exists($backup_cfg)){
$content .= "Найден файл конфигурации:
";
$content .= "Server Name: ".$backup_servername."<br>";
$content .= "Login: ".$backup_login."<br>";
$content .= "Password: ".$backup_password."<br>";
$content .= "DB Name: ".$backup_dbname."<br>";
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>";
}
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
Имя сервера:
";
}
$content .= "";
print $content;
?>