PageRenderTime 33ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/backup_db.php

https://bitbucket.org/flth/xtcm
PHP | 351 lines | 267 code | 42 blank | 42 comment | 60 complexity | 83d6f8d76c2f082cc5f0904312cdbe8c MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**************************************************************
  3. $Id: backup_db.php 2397 2011-11-24 13:01:31Z web28 $
  4. * XTC Datenbank Manager Version 1.92
  5. *(c) by web28 - www.rpa-com.de
  6. * Backup pro Tabelle und limitierter Zeilenzahl (Neuladen der Seite) , einstellbar mit ANZAHL_ZEILEN_BKUP
  7. * Restore mit limitierter Zeilennanzahl aus SQL-Datei (Neuladen der Seite), einstellbar mit ANZAHL_ZEILEN
  8. * 2011-11-23 - restore in separate file
  9. * 2010-09-09 - add set_admin_access
  10. * 2011-07-02 - Security Fix - PHP_SELF
  11. * 2011-09-13 - fix some PHP notices
  12. ***************************************************************/
  13. //#################################
  14. define ('ANZAHL_ZEILEN_BKUP', 20000); //Anzahl der Zeilen die beim Backup pro Durchlauf maximal aus einer Tabelle gelesen werden.
  15. define ('MAX_RELOADS', 600); //Anzahle der maximalen Seitenreloads beim Backup - falls etwas nicht richtig funktioniert stoppt das Script nach 600 Seitenaufrufen
  16. //#################################
  17. define ('VERSION', 'Database Backup Ver. 1.92');
  18. require('includes/application_top.php');
  19. include ('includes/functions/db_restore.php');
  20. $action = (isset($_GET['action']) ? $_GET['action'] : '');
  21. //Dateiname fuer Selbstaufruf
  22. $bk_filename = basename($_SERVER['SCRIPT_NAME']); // web28 - 2011-07-02 - Security Fix - PHP_SELF
  23. //Animierte Gif-Datei und Hinweistext
  24. $info_wait = '<img src="images/loading.gif"> '. TEXT_INFO_WAIT ;
  25. $button_back = '';
  26. //aktiviert die Ausgabepufferung
  27. if (!@ob_start("ob_gzhandler")) @ob_start();
  28. //Start Session
  29. session_name('dbdump');
  30. if(!isset($_SESSION)) {
  31. session_start();
  32. }
  33. //#### BACKUP ANFANG #######
  34. if (isset($_SESSION['dump'])) {
  35. $dump=$_SESSION['dump'];
  36. }
  37. function WriteToDumpFile($data) {
  38. $df = $_SESSION['dump']['file'];
  39. if (isset($data) && $data!='') {
  40. if ($_SESSION['dump']['compress']) {
  41. if ($data!='') {
  42. $fp=gzopen($df,'ab');
  43. gzwrite($fp,$data);
  44. gzclose($fp);
  45. }
  46. } else {
  47. if ($data!=''){
  48. $fp=fopen($df,'ab');
  49. fwrite($fp,$data);
  50. fclose($fp);
  51. }
  52. }
  53. }
  54. unset($data);
  55. }
  56. function GetTableInfo($table) {
  57. //BOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER - functions_dump.php line 133
  58. $data = "DROP TABLE IF EXISTS `$table`;\n";
  59. $res = mysql_query('SHOW CREATE TABLE `'.$table.'`');
  60. $row = @mysql_fetch_row($res);
  61. $data .= $row[1].';'."\n\n";
  62. $data .= "/*!40000 ALTER TABLE `$table` DISABLE KEYS */;\n";
  63. //EOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER
  64. WriteToDumpFile($data);
  65. //Datensaetze feststellen
  66. $sql="SELECT count(*) as `count_records` FROM `".$table."`";
  67. $res=@mysql_query($sql);
  68. $res_array = mysql_fetch_array($res);
  69. return $res_array['count_records'];
  70. }
  71. function GetTableData($table) {
  72. global $dump;
  73. // Dump the data
  74. if ( ($table != TABLE_SESSIONS ) && ($table != TABLE_WHOS_ONLINE) && ($table != TABLE_ADMIN_ACTIVITY_LOG) ) {
  75. $table_list = array();
  76. $fields_query = mysql_query("SHOW COLUMNS FROM " . $table);
  77. while ($fields = mysql_fetch_array($fields_query)) {
  78. $table_list[] = $fields['Field'];
  79. }
  80. $rows_query = mysql_query('select `' . implode('`,`', $table_list) . '` from '.$table . ' limit '.$dump['zeilen_offset'].','.($dump['anzahl_zeilen']));
  81. $ergebnisse = @mysql_num_rows($rows_query);
  82. $data = '';
  83. if ($ergebnisse!== false) {
  84. if (($ergebnisse + $dump['zeilen_offset']) < $dump['table_records']) {
  85. //noch nicht fertig - neuen Startwert festlegen
  86. $dump['zeilen_offset']+= $dump['anzahl_zeilen'];
  87. } else {
  88. //Fertig - naechste Tabelle
  89. $dump['nr']++;
  90. $dump['table_offset'] = 0;
  91. }
  92. //BOF Complete Inserts ja/nein
  93. if ($_SESSION['dump']['complete_inserts'] == 'yes') {
  94. while ($rows = mysql_fetch_array($rows_query)) {
  95. $insert = 'INSERT INTO `'.$table.'` (`' . implode('`, `', $table_list) . '`) VALUES (';
  96. foreach ($table_list as $column) {
  97. //EOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER -functions_dump.php line 186
  98. if (!isset($rows[$column])) {
  99. $insert.='NULL,';
  100. } else if ($rows[$column]!='') {
  101. $insert.='\''.mysql_escape_string($rows[$column]).'\',';
  102. } else {
  103. $insert.='\'\',';
  104. }
  105. //BOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER
  106. }
  107. $data .=substr($insert,0,-1).');'. "\n";
  108. }
  109. } else {
  110. $lines = array();
  111. while ($rows = mysql_fetch_array($rows_query)) {
  112. $values=array();
  113. foreach ($table_list as $column) {
  114. //EOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER
  115. if (!isset($rows[$column])) {
  116. $values[] ='NULL';
  117. } else if ($rows[$column]!='') {
  118. $values[] ='\''.mysql_escape_string($rows[$column]).'\'';
  119. } else {
  120. $values[] ='\'\'';
  121. }
  122. //BOF NEW TABLE STRUCTURE - LIKE MYSQLDUMPER
  123. }
  124. $lines[] = implode(', ', $values);
  125. }
  126. $tmp = trim(implode("),\n (", $lines));
  127. if ($tmp != '') {
  128. $data = 'INSERT INTO `'.$table.'` (`' . implode('`, `', $table_list) . '`) VALUES'."\n" . ' ('.$tmp.");\n";
  129. }
  130. }
  131. //EOF Complete Inserts ja/nein
  132. if ($dump['table_offset'] == 0)
  133. $data.= "/*!40000 ALTER TABLE `$table` ENABLE KEYS */;\n\n";
  134. //echo nl2br($data);
  135. WriteToDumpFile($data);
  136. } // FEHLER
  137. } else {
  138. $dump['nr']++;
  139. $dump['table_offset'] = 0;
  140. }
  141. }
  142. if ($action == 'backupnow') {
  143. $info_text = TEXT_INFO_DO_BACKUP;
  144. $restore= array();
  145. unset($_SESSION['restore']);
  146. $dump = array();
  147. unset($_SESSION['dump']);
  148. @xtc_set_time_limit(0);
  149. //BOF Disable "STRICT" mode!
  150. $vers = @mysql_get_client_info();
  151. if(substr($vers,0,1) > 4) {
  152. @mysql_query("SET SESSION sql_mode=''");
  153. }
  154. //EOF Disable "STRICT" mode!
  155. if (function_exists('mysql_get_client_info')) {
  156. $mysql_version = '-- MySQL-Client-Version: ' . mysql_get_client_info() . "\n--\n";
  157. } else {
  158. $mysql_verion = '';
  159. }
  160. $schema = '-- XT-Commerce & compatible' . "\n" .
  161. '--' . "\n" .
  162. '-- ' . VERSION . ' (c) by web28 - www.rpa-com.de' . "\n" .
  163. '-- ' . STORE_NAME . "\n" .
  164. '-- ' . STORE_OWNER . "\n" .
  165. '--' . "\n" .
  166. '-- Database: ' . DB_DATABASE . "\n" .
  167. '-- Database Server: ' . DB_SERVER . "\n" .
  168. '--' . "\n" . $mysql_version .
  169. '-- Backup Date: ' . date(PHP_DATE_TIME_FORMAT) . "\n\n";
  170. $backup_file = 'dbd_' . DB_DATABASE . '-' . date('YmdHis');
  171. $dump['file'] = DIR_FS_BACKUP . $backup_file;
  172. if ($_POST['compress'] == 'gzip') {
  173. $dump['compress'] = true;
  174. $dump['file'] .= '.sql.gz';
  175. } else {
  176. $dump['compress'] = false;
  177. $dump['file'] .= '.sql';
  178. }
  179. if ($_POST['complete_inserts'] == 'yes') {
  180. $dump['complete_inserts'] = 'yes';
  181. }
  182. $tabellen = mysql_query('SHOW TABLE STATUS');
  183. $dump['num_tables'] = mysql_num_rows($tabellen);
  184. //Tabellennamen in Array einlesen
  185. $dump['tables'] = Array();
  186. if ($dump['num_tables'] > 0){
  187. for ($i=0; $i < $dump['num_tables']; $i++){
  188. $row = mysql_fetch_array($tabellen);
  189. $dump['tables'][$i] = $row['Name'];
  190. }
  191. $dump['nr'] = 0;
  192. } //else ERROR
  193. $dump['table_offset'] = 0;
  194. $_SESSION['dump']=$dump;
  195. WriteToDumpFile($schema);
  196. flush();
  197. $selbstaufruf='<script language="javascript" type="text/javascript">setTimeout("document.dump.submit()", 3000);</script></div>';
  198. }
  199. //Seite neu laden wenn noch nicht alle Tabellen ausgelesen sind
  200. if ($dump['num_tables'] > 0 && $action != 'backupnow'){
  201. $info_text = TEXT_INFO_DO_BACKUP;
  202. @xtc_set_time_limit(0);
  203. if ($dump['nr'] < $dump['num_tables']) {
  204. $nr = $dump['nr'];
  205. $dump['aufruf']++;
  206. $table_ok = 'Tabellen gesichert: ' . ($nr + 1) . '<br><br>Zuletzt bearbeitet: ' . $dump['tables'][$nr] . '<br><br>Seitenaufrufe: ' . $dump['aufruf'] ;
  207. //Neue Tabelle
  208. if ($dump['table_offset'] == 0) {
  209. $dump['table_records'] = GetTableInfo($dump['tables'][$nr]);
  210. $dump['anzahl_zeilen']= ANZAHL_ZEILEN_BKUP;
  211. $dump['table_offset'] = 1;
  212. $dump['zeilen_offset'] = 0;
  213. } else {
  214. //Daten aus Tabelle lesen
  215. GetTableData($dump['tables'][$nr]);
  216. }
  217. $_SESSION['dump']= $dump;
  218. $selbstaufruf='<script language="javascript" type="text/javascript">setTimeout("document.dump.submit()", 10);</script></div>';
  219. //Verhindert Endlosschleife - Script wir nach MAX_RELOADS beendet
  220. if ( $dump['aufruf'] > MAX_RELOADS) {
  221. $selbstaufruf = '';
  222. }
  223. } else { //Fertig
  224. $info_wait = '';
  225. $info_text = TEXT_INFO_DO_BACKUP_OK;
  226. $table_ok= 'Tabellen gesichert: ' . $dump['nr'] . '<br><br>Seitenaufrufe: ' . $dump['aufruf'] ;
  227. $button_back = '<a href="backup.php" class="button">'. BUTTON_BACK .'</a>';
  228. $selbstaufruf = '';
  229. unset ($_SESSION['dump']);
  230. $button_back = '<a href="backup.php" class="button">'. BUTTON_BACK .'</a>';
  231. //$selbstaufruf='<script language="javascript" type="text/javascript">window.location.href = "backup.php";</script></div>';
  232. }
  233. }
  234. //#### BACKUP ENDE #######
  235. ?>
  236. <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
  237. <html <?php echo HTML_PARAMS; ?>>
  238. <head>
  239. <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $_SESSION['language_charset']; ?>" />
  240. <title><?php echo TITLE; ?></title>
  241. <link rel="stylesheet" type="text/css" href="includes/stylesheet.css" />
  242. </head>
  243. <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
  244. <!-- header //-->
  245. <?php require(DIR_WS_INCLUDES . 'header.php'); ?>
  246. <!-- header_eof //-->
  247. <!-- body //-->
  248. <?php
  249. echo '<form name="dump" action="'. $bk_filename.'?dbdump='.session_id().'" method="POST"></form>';
  250. ?>
  251. <table border="0" width="100%" cellspacing="2" cellpadding="2">
  252. <tr>
  253. <td class="columnLeft2" width="<?php echo BOX_WIDTH; ?>" valign="top">
  254. <table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
  255. <!-- left_navigation //-->
  256. <?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
  257. <!-- left_navigation_eof //-->
  258. </table>
  259. </td>
  260. <!-- body_text //-->
  261. <td class="boxCenter" width="100%" valign="top">
  262. <table border="0" width="100%" cellspacing="0" cellpadding="2">
  263. <tr>
  264. <td>
  265. <table border="0" width="100%" cellspacing="0" cellpadding="0">
  266. <tr>
  267. <td class="pageHeading"><?php echo HEADING_TITLE; ?><span class="smallText"> [<?php echo VERSION; ?>]</span></td>
  268. <td class="pageHeading" align="right"><?php echo xtc_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
  269. </tr>
  270. </table>
  271. </td>
  272. </tr>
  273. <tr>
  274. <td>
  275. <table border="0" width="100%" cellspacing="0" cellpadding="0">
  276. <tr>
  277. <td align="center" valign="top">
  278. <p>&nbsp;</p>
  279. <p>&nbsp;</p>
  280. <p class="pageHeading">&nbsp;<?php echo $info_text . '<br /> <br />' . $info_wait; ?>&nbsp;</p>
  281. <p class="main">&nbsp;<b><?php echo $table_ok; ?><b>&nbsp;</p>
  282. <p>&nbsp;<?php echo $button_back; ?>&nbsp;</p>
  283. </td>
  284. </tr>
  285. </table>
  286. </td>
  287. </tr>
  288. </table>
  289. </td>
  290. <!-- body_text_eof //-->
  291. </tr>
  292. </table>
  293. <!-- body_eof //-->
  294. <?php
  295. if ($selbstaufruf != '')
  296. echo $selbstaufruf;
  297. ?>
  298. <!-- footer //-->
  299. <?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
  300. <!-- footer_eof //-->
  301. <br />
  302. </body>
  303. </html>
  304. <?php
  305. require(DIR_WS_INCLUDES . 'application_bottom.php');
  306. //Pufferinhalte an den Client ausgeben
  307. ob_end_flush();
  308. ?>