Posted By

unMiracle on 01/05/11


Tagged

mysql php backup port 80


Versions (?)

Backup


 / Published in: PHP
 

Копирование бд через 80 порт

  1. <?php
  2. require_once("../core.php");
  3. require_once(BASEDIR."getpage.php");
  4.  
  5. define("TMP_CFG", "backup_config.dat");
  6. define("CONFIG", "backup_cfg.php");
  7. define("FILE_TABLES", "backup_file_tables.dat");
  8.  
  9. $parse = "////\n";
  10.  
  11. chdir(BASEDIR.dirname($_SERVER['PHP_SELF'])."/");
  12.  
  13. if (file_exists(CONFIG)) require_once(CONFIG);
  14.  
  15. function structuredb(){
  16. include("backup_cnt.php");
  17.  
  18. $struct_db = "structure_".$backup_dbname.".dat"; // файл структуры БД
  19. if (file_exists($struct_db)) unlink($struct_db);
  20. $fp = fopen($struct_db,"a+");
  21.  
  22. $tables = mysql_list_tables($backup_dbname); // список таблиц
  23. while ($table = mysql_fetch_row($tables)) { // перебор таблиц
  24.  
  25. $fields = mysql_list_fields($backup_dbname,$table[0]); // список полей таблицы
  26. $count_fields = mysql_num_fields($fields); // количество полей
  27.  
  28. fwrite($fp,"\nTable: ".$table[0]."\n");
  29. for ($i = 0; $i < $count_fields; $i++){ // перебор полей
  30. $name_fields = mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
  31. $type_fields = mysql_field_type($fields, $i);
  32. $len_fields = mysql_field_len($fields, $i);
  33. $flag_fields = mysql_field_flags($fields, $i);
  34. $name_field = mysql_field_name($fields, $i); // вывод шапки таблицы (имена полей)
  35. fwrite($fp,"Field: $name_fields | $type_fields | $len_fields | $flag_fields\n");
  36. } // END FOR #1
  37. } // END WHILE #1
  38. fclose($fp);
  39.  
  40. $content = "<b>Save structure db $backup_dbname - complite.</b>";
  41. $fo = fopen($struct_db,"r");
  42. $content .= "<H3>Структура БД: $backup_dbname</H3><BR /><BR />";
  43.  
  44. $data = fread($fo,filesize($struct_db));
  45. $data = str_replace("\n","<BR>",$data);
  46. $data = str_replace("Table:","<B>Table:</B>",$data);
  47. $data = str_replace("Field:","&nbsp &nbsp <B>Field:</B>",$data);
  48.  
  49. fclose($fo);
  50. $content .= $data;
  51.  
  52. $content .= "<hr>
  53. <form method=\"post\" action='".$_SERVER['PHP_SELF']."'>
  54. <input type=\"submit\" name=\"nextstep\" value=\"Туче\">
  55. </form>";
  56.  
  57. return $content; //"Function Structure DB";
  58. }
  59.  
  60. function copydb($parse,$start){
  61. include("backup_cnt.php");
  62. $content = "";
  63. $dirdata = "database";
  64. if (!file_exists($dirdata) || !is_dir($dirdata)) mkdir($dirdata);
  65.  
  66. $backup_ft = fopen(FILE_TABLES,"r");
  67. $backup_tables = fread($backup_ft,filesize(FILE_TABLES));
  68. fclose($backup_ft);
  69. $backup_table = explode("\n",$backup_tables);
  70.  
  71. for ($i_table = 0; $i_table < count($backup_table); $i_table++){
  72. if (substr($backup_table[$i_table],0,1) != "#"){
  73. $fields = mysql_list_fields($backup_dbname,$backup_table[$i_table]); // список полей таблицы
  74. $count_fields = mysql_num_fields($fields); // количество полей
  75.  
  76. $name_fields = "";
  77. for ($i = 0; $i < $count_fields; $i++){ // перебор полей
  78. $name_fields[] .= mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
  79. } // END FOR #2
  80.  
  81. $sql_count = mysql_query("SELECT count(*) AS c FROM ".$backup_table[$i_table]);
  82. $count_str = mysql_result($sql_count,'c');
  83. $max_count = 5000;
  84.  
  85. if ($count_str > $max_count){
  86. if (empty($start)) $start = 0; else $start = intval($start);
  87. $file = $backup_table[$i_table].".dat";
  88. if (file_exists($dirdata."/".$file)){
  89. if (filemtime($dirdata."/".$file) < time() - 30) unlink($dirdata."/".$file);
  90. header("Refresh: 0;");
  91. }
  92. $fo = fopen($dirdata."/".$file,"a");
  93. if ($count_str >= $start + $max_count){
  94. $sql = mysql_query("SELECT * FROM ".$backup_table[$i_table]." LIMIT $start, $max_count"); // выборка
  95. $i = 0;
  96. while (mysql_fetch_array($sql)){
  97. fputs($fo,$parse);
  98. for ($y = 0; $y < $count_fields; $y++){
  99. $name_field_db = $name_fields[$y];
  100. $data_field = mysql_result($sql,$i,$name_field_db);
  101. $dstr = $data_field."\n";
  102. fputs($fo,"$dstr");
  103. } // END FOR #2
  104. fputs($fo,"\n\n");
  105. $i++;
  106. } // END WHILE #2
  107. fclose($fo);
  108. $start = $start + $max_count;
  109. print "<meta http-equiv=\"refresh\" content=\"2;url=http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?s=$start\">";
  110. break;
  111. // END IF $count_str > $start + $max_count
  112. } elseif ($count_str > $start){ // копируем остаток таблицы
  113. $count = $count_str - $start;
  114. $sql = mysql_query("SELECT * FROM ".$backup_table[$i_table]." LIMIT $start, $count"); // выборка
  115. $i = 0;
  116. while (mysql_fetch_array($sql)){
  117. fputs($fo,$parse);
  118. for ($y = 0; $y < $count_fields; $y++){
  119. $name_field_db = $name_fields[$y];
  120. $data_field = mysql_result($sql,$i,$name_field_db);
  121. $dstr = $data_field."\n";
  122. fputs($fo,"$dstr");
  123. } // END FOR #2
  124. fputs($fo,"\n\n");
  125. $i++;
  126. } // END WHILE #2
  127. fclose($fo);
  128. }
  129. $backup_ft = fopen(FILE_TABLES,"w");
  130. for ($j = 0; $j < count($backup_table) - 1; $j++){
  131. if ($j == $i_table) $backup_table[$j] = "#".$backup_table[$j];
  132. fputs($backup_ft,$backup_table[$j]."\n");
  133. }
  134. $j = count($backup_table) - 1;
  135. if ($j == $i_table) $backup_table[$j] = "#".$backup_table[$j];
  136. fputs($backup_ft,$backup_table[$j]);
  137. fclose($backup_ft);
  138. $content .= "Table <b>".$backup_table[$i_table]."</b> ($count_str) - complite.<br>";
  139. } else {
  140. $sql = mysql_query("SELECT * FROM ".$backup_table[$i_table]); // выборка
  141. $file = $backup_table[$i_table].".dat";
  142. if (file_exists($dirdata."/".$file)) unlink($dirdata."/".$file);
  143. $fo = fopen($dirdata."/".$file,"a");
  144. $i = 0;
  145. while (mysql_fetch_array($sql)){
  146. fputs($fo,$parse);
  147. for ($y = 0; $y < $count_fields; $y++){
  148. $name_field_db = $name_fields[$y];
  149. $data_field = mysql_result($sql,$i,$name_field_db);
  150. $dstr = $data_field."\n";
  151. fputs($fo,"$dstr");
  152. } // END FOR #2
  153. fputs($fo,"\n\n");
  154. $i++;
  155. } // END WHILE #2
  156. fclose($fo);
  157. $backup_ft = fopen(FILE_TABLES,"w");
  158. for ($j = 0; $j < count($backup_table) - 1; $j++){
  159. if ($j == $i_table) $backup_table[$j] = "#".$backup_table[$j];
  160. fputs($backup_ft,$backup_table[$j]."\n");
  161. }
  162. $j = count($backup_table) - 1;
  163. if ($j == $i_table) $backup_table[$j] = "#".$backup_table[$j];
  164. fputs($backup_ft,$backup_table[$j]);
  165. fclose($backup_ft);
  166. $content .= "Table <b>".$backup_table[$i_table]."</b> ($i) - complite.<br>";
  167. } // if > 5000
  168. }
  169. } // END FOR #1
  170.  
  171. $backup_ft = fopen(FILE_TABLES,"r");
  172. $backup_tables = fread($backup_ft,filesize(FILE_TABLES));
  173. fclose($backup_ft);
  174. $backup_table = explode("\n",$backup_tables);
  175. if (substr($backup_table[count($backup_table) - 1], 0, 1) == "#"){ // последняя строка файла
  176. unlink(FILE_TABLES);
  177. unlink(CONFIG);
  178. $content .= sendmail();
  179. }
  180. return $content;
  181. }
  182.  
  183. function sendmail(){
  184. $boundary = "--".md5(uniqid(time()));
  185. $headers = "From: My site<[email protected]>
  186. ";
  187. $headers .= "Reply-To: [email protected]
  188. ";
  189. $headers .= "Return-Path: [email protected]
  190. ";
  191. $headers .= "X-Mailer: Jonel\n";
  192. $headers .= "MIME-Version: 1.0
  193. ";
  194. $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"
  195. ";
  196. $kod = 'windows-1251'; // utf-8
  197. $multipart .= "--$boundary\n";
  198. $multipart .= "Content-Type: text/html; charset=$kod\n";
  199. $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
  200. $multipart .= "Backup\n\n";
  201.  
  202. global $backup_dbname;
  203. $path = "structure_".$backup_dbname.".dat";
  204. if (file_exists($path)){
  205. $fp = fopen($path,"r");
  206. if ($fp){
  207. $file = fread($fp,filesize($path));
  208. fclose($fp);
  209. $message_part = "";
  210. $message_part .= "Content-Type: application/octet-stream";
  211. $message_part .= "; name = \"$path\"\n";
  212. $message_part .= "Content-Transfer-Encoding: base64\n";
  213. $message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
  214. $message_part .= chunk_split(base64_encode($file))."\n\n";
  215. $multipart .= "--$boundary\n".$message_part;
  216. unlink($path);
  217. }
  218. }
  219.  
  220. $database = opendir("database/");
  221. while ($filename = readdir($database)){
  222. $ftype = filetype("database/".$filename);
  223. if ($ftype != "dir" && preg_match("#.dat$#D",$filename)){
  224. $path = "database/".$filename;
  225. $fp = fopen($path,"r");
  226. if ($fp){
  227. if (filesize($path) == 0) $file = "";
  228. else $file = fread($fp,filesize($path));
  229. fclose($fp);
  230. $message_part = "Content-Type: application/octet-stream";
  231. $message_part .= "; name = \"$filename\"\n";
  232. $message_part .= "Content-Transfer-Encoding: base64\n";
  233. $message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
  234. $message_part .= chunk_split(base64_encode($file))."\n\n";
  235. $multipart .= "--$boundary\n".$message_part;
  236. unlink($path);
  237. } // END IF #2
  238. }
  239. } // END WHILE
  240. $multipart .= "--$boundary--\n";
  241.  
  242. if (mail("[email protected]","BackUp",$multipart,$headers))
  243. return "Message sent.";
  244. else return "Error sending.";
  245. }
  246.  
  247. $content = "
  248. <div class=\"logStyle\">
  249. <h2>Backup</h2>";
  250.  
  251.  
  252. if (isset($_GET['s']) && !empty($_GET['s'])){
  253. $start = intval($_GET['s']);
  254. //&& isset($_GET['t']) && !empty($_GET['t'])
  255. //$table = htmlspecialchars($_GET['t'], ENT_QUOTES);
  256. $content .= copydb($parse,$start);
  257. } elseif (isset($_POST['step_1']) && isset($_POST['servername']) && !empty($_POST['servername'])){
  258. $backup_fp = fopen(TMP_CFG,"w");
  259. $backup_server = htmlspecialchars($_POST['servername'], ENT_QUOTES);
  260. fwrite($backup_fp,$backup_server); // Первая строка во временном конфиге
  261. fclose($backup_fp);
  262. header("Refresh: 0;");
  263. } elseif (file_exists(TMP_CFG)){
  264. if (isset($_POST['step_2']) && isset($_POST['user_db']) && isset($_POST['pass_db']) && !empty($_POST['user_db'])){
  265. $backup_fp = fopen(TMP_CFG,"a");
  266. $backup_lp = $_POST['user_db']."\n".$_POST['pass_db'];
  267. fwrite($backup_fp,"\n".$backup_lp); // Вторая и третья строки
  268. fclose($backup_fp);
  269.  
  270. // Подключение к серверу и выбор базы для копирования
  271. $backup_fp = fopen(TMP_CFG,"r");
  272. $backup_data = fread($backup_fp,filesize(TMP_CFG));
  273. fclose($backup_fp);
  274. $backup_data = explode("\n",$backup_data);
  275. $backup_servername = $backup_data[0];
  276. $backup_login = $backup_data[1];
  277. $backup_password = $backup_data[2];
  278. $backup_conn = @mysql_connect($backup_servername,$backup_login,$backup_password);
  279. if (!$backup_conn){
  280. // Если неверный логин/пароль - то удаляем их из файла, тем самым попадаем на их ввод.
  281. $backup_fp = fopen(TMP_CFG,"w");
  282. fwrite($backup_fp,$backup_servername);
  283. fclose($backup_fp);
  284. header("Refresh: 5;");
  285. die("Could not connect: <b>Неверный логин или пароль.</b> <i>Страница перезагрузится автоматически через 5 секунд.</i>");
  286. } else {
  287. $backup_dbs = @mysql_list_dbs($backup_conn);
  288. $content .= "
  289. <form method=\"post\" action='".$_SERVER['PHP_SELF']."'>
  290. <h4>База данный для копирования:</h4>
  291. <div><select name=\"name_db\">
  292. <option>--</option>";
  293. while ($backup_db_name = mysql_fetch_object($backup_dbs)){
  294. $content .= "
  295. <option value='".$backup_db_name->Database."'"; if(isset($backup_dbname) && $backup_db_name->Database == $backup_dbname) $content .= " selected"; $content .= ">".$backup_db_name->Database."</option>";
  296. }
  297. $content .= "
  298. </select>
  299. <input type=\"checkbox\" name=\"copy_struct\" value=\"1\"><i>Копировать структуру базы.</i></div><br />
  300. <input type=\"submit\" name=\"step_3\" value=\"Ñîõðàíèòü\">
  301. </form>";
  302. }
  303. //
  304. } elseif (isset($_POST['step_3']) && isset($_POST['name_db']) && !empty($_POST['name_db'])){
  305. $backup_fp = fopen(TMP_CFG,"a");
  306. fwrite($backup_fp,"\n".$_POST['name_db']); // и последнее - название бд
  307. fclose($backup_fp);
  308. $backup_fp = fopen(TMP_CFG,"r"); // после этого считываем все что есть во временном файле
  309. $backup_data = fread($backup_fp,filesize(TMP_CFG));
  310. fclose($backup_fp);
  311. $backup_str = explode("\n",$backup_data);
  312.  
  313. $backup_servername = $backup_str[0];
  314. $backup_login = $backup_str[1];
  315. $backup_password = $backup_str[2];
  316. $backup_dbname = $backup_str[3];
  317.  
  318. $backup_fp = fopen(CONFIG,"w"); // и создаем конфиг-файл (.php)
  319. $backup_write = '<?php'."\n".'$backup_servername = "'.$backup_servername.'";'."\n".'$backup_login = "'.$backup_login.'";'."\n".'$backup_password = "'.$backup_password.'";'."\n".'$backup_dbname = "'.$backup_dbname.'";'."\n".'?>';
  320. fwrite($backup_fp,$backup_write);
  321. fclose($backup_fp);
  322. unlink(TMP_CFG);
  323.  
  324. include("backup_cnt.php");
  325. //
  326. $backup_ft = fopen(FILE_TABLES,"w");
  327. $tables = mysql_list_tables($backup_dbname); // список таблиц
  328. for ($i_wf = 0; $i_wf < mysql_num_rows($tables) - 1; $i_wf++){
  329. $table = mysql_tablename($tables,$i_wf);
  330. fwrite($backup_ft,$table."\n");
  331. }
  332. fwrite($backup_ft,mysql_tablename($tables,mysql_num_rows($tables) - 1));
  333. fclose($backup_ft);
  334. mysql_close($backup_conn);
  335. if (isset($_POST['copy_struct'])) $content .= structuredb();
  336. else $content .= copydb($parse,"");
  337.  
  338. } else {
  339. $backup_fp = fopen(TMP_CFG,"r");
  340. $backup_data = fread($backup_fp,filesize(TMP_CFG));
  341. fclose($backup_fp);
  342. $backup_count_str = count(explode("\n",$backup_data));
  343. if ($backup_count_str == 1){
  344. // Переменные $backup_login/$backup_password получаются из существующего конфиг-файла (если он существует).
  345. $content .= "
  346. <form method=\"post\" action='".$_SERVER['PHP_SELF']."'>
  347. <h4>Login:</h4><input type=\"text\" name=\"user_db\" value=\"".$backup_login."\">
  348. <h4>Password:</h4><input type=\"text\" name=\"pass_db\" value=\"".$backup_password."\">
  349. <input type=\"submit\" name=\"step_2\" value=\"Save\">
  350. </form>";
  351. } else {
  352. unlink(TMP_CFG);
  353. if (file_exists(CONFIG)) unlink(CONFIG);
  354. header("Refresh: 0;");
  355. }
  356. }
  357. // После копирования структуры бд
  358. } elseif (isset($_POST['nextstep'])){
  359. $content .= copydb($parse,"");
  360. // Удаление найденного конфига
  361. } elseif (isset($_POST['deleteconfig'])){
  362. unlink(CONFIG);
  363. header("Refresh: 0;");
  364. } else {
  365. if (file_exists(CONFIG)){
  366. $content .= "<h4>Найдет файл конфигурации:</h4>";
  367. $content .= "<b>Server Name: </b>".$backup_servername."<br>";
  368. $content .= "<b>Login: </b>".$backup_login."<br>";
  369. $content .= "<b>Password: </b>".$backup_password."<br>";
  370. $content .= "<b>DB Name: </b>".$backup_dbname."<br>";
  371. $content .= "<hr><form method=\"post\" action='".$_SERVER['PHP_SELF']."'><input type=\"submit\" name=\"deleteconfig\" value=\"Delete\"></form>";
  372. }
  373. $content .= "
  374. <form method=\"post\" action='".$_SERVER['PHP_SELF']."'>
  375. <h4>Name server:</h4><input type=\"text\" name=\"servername\" value=\"$backup_servername\">
  376. <input type=\"submit\" name=\"step_1\" value=\"Next\">
  377. </form>";
  378. }
  379. $content .= "</div>";
  380. getPage($content,"");
  381. ?>

Report this snippet  

You need to login to post a comment.