_database_dump = ''; // Циклически обрабатываем каждую таблицу foreach ($_REQUEST['ta'] as $table) { if (! DB_EXPORT_PREFIX) $table_export = preg_replace('/^' . PREFIX . '/', '%%PRFX%%', $table); // Если таблица имеет корректный префикс if (preg_match('/^' . preg_quote(PREFIX) . '_/', $table)) { $row = $AVE_DB->Query("SHOW CREATE TABLE " . $table)->FetchArray(); // Сохраняем CREATE и DROP запросы $this->_database_dump .= "DROP TABLE IF EXISTS `" . (! DB_EXPORT_PREFIX ? $table_export : $table) . "`;" . $this->_delimiter . "\n"; if (! DB_EXPORT_PREFIX) $this->_database_dump .= str_replace('CREATE TABLE `' . PREFIX . '_', 'CREATE TABLE `%%PRFX%%_', $row[1]) . ";" . $this->_delimiter . "\n\n"; else $this->_database_dump .= $row[1] . ";" . $this->_delimiter . "\n\n"; $nums = 0; // Получаем данные, которые в дальнейшем будут вставлены в INSERT запросы. $sql = $AVE_DB->Query('SELECT * FROM `' . $table . '`'); while ($row = $sql->FetchArray()) { if ($nums == 0) { $nums = $sql->NumFields(); $temp_array = array(); for ($i = 0; $i < $nums; $i++) { $temp_array[] = $sql->FieldName($i); } $table_list = '(`' . implode('`, `', $temp_array) . '`)'; } $temp_array = array(); for ($i=0; $i<$nums; $i++) { if (! isset($row[$i])) { $temp_array[] = 'NULL'; } elseif ($row[$i] != '') { $temp_array[] = "'" . str_replace($search, $replace, addslashes($row[$i])) . "'"; } else { $temp_array[] = "''"; } } // Сохряняем INSERT запросы $this->_database_dump .= 'INSERT INTO `' . (! DB_EXPORT_PREFIX ? $table_export : $table) . '` ' . $table_list . ' VALUES (' . implode(', ', $temp_array) . ");" . $this->_delimiter . "\n"; } $this->_database_dump .= "\n"; $sql->Close(); } } return ! empty($this->_database_dump); } /** * Метод, предназначенный для формирования файла дампа базы данных * * @return boolean */ function _databaseTopDumpCreate() { global $AVE_DB; $dbtables = array(); $sql = $AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_%'"); while ($row = $sql->FetchArray()) { array_push($dbtables, $row[0]); } $search = array("\x00", "\x0a", "\x0d", "\x1a"); $replace = array('\0', '\n', '\r', '\Z'); $this->_database_dump = ''; // Циклически обрабатываем каждую таблицу foreach ($dbtables as $table) { if (! DB_EXPORT_PREFIX) $table_export = preg_replace('/^' . PREFIX . '/', '%%PRFX%%', $table); // Если таблица имеет корректный префикс if (preg_match('/^' . preg_quote(PREFIX) . '_/', $table)) { $row = $AVE_DB->Query("SHOW CREATE TABLE " . $table)->FetchArray(); // Сохраняем CREATE и DROP запросы $this->_database_dump .= "DROP TABLE IF EXISTS `" . (! DB_EXPORT_PREFIX ? $table_export : $table) . "`;" . $this->_delimiter . "\n"; if (! DB_EXPORT_PREFIX) $this->_database_dump .= str_replace('CREATE TABLE `' . PREFIX . '_', 'CREATE TABLE `%%PRFX%%_', $row[1]) . ";" . $this->_delimiter . "\n\n"; else $this->_database_dump .= $row[1] . ";" . $this->_delimiter . "\n\n"; $nums = 0; // Получаем данные, которые в дальнейшем будут вставлены в INSERT запросы. $sql = $AVE_DB->Query('SELECT * FROM `' . $table . '`'); while ($row = $sql->FetchArray()) { if ($nums==0) { $nums = $sql->NumFields(); $temp_array = array(); for ($i=0; $i<$nums; $i++) { $temp_array[] = $sql->FieldName($i); } $table_list = '(`' . implode('`, `', $temp_array) . '`)'; } $temp_array = array(); for ($i=0; $i<$nums; $i++) { if (!isset($row[$i])) { $temp_array[] = 'NULL'; } elseif ($row[$i] != '') { $temp_array[] = "'" . str_replace($search, $replace, addslashes($row[$i])) . "'"; } else { $temp_array[] = "''"; } } // Сохряняем INSERT запросы $this->_database_dump .= 'INSERT INTO `' . (! DB_EXPORT_PREFIX ? $table_export : $table) . '` ' . $table_list . ' VALUES (' . implode(', ', $temp_array) . ");" . $this->_delimiter . "\n"; } $this->_database_dump .= "\n"; $sql->Close(); } } return ! empty($this->_database_dump); } /** * Внешние методы класса */ /** * Метод, предназначенный для сохранения файла дампа базы данных на жеский диск * */ function databaseDumpExport($top = 0, $exit = 0) { global $AVE_Template; // Если дамп не удалось создать, тогда завершаем работу if ($top) { if (! $this->_databaseTopDumpCreate()) exit; } else { if (! $this->_databaseDumpCreate()) exit; } // Готовим шаблон имени файла $file_name = preg_replace_ru(array("/%SERVER%/", "/%DATE%/", "/%TIME%/"), array($_SERVER['SERVER_NAME'], date('d.m.y'), date('H.i.s')), DB_EXPORT_TPL); $dump = (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? gzencode($this->_database_dump) : $this->_database_dump); if (isset($_REQUEST['server']) && $_REQUEST['server'] == 1) { if (! is_dir(BASE_DIR . '/tmp/backup/')) { @mkdir(BASE_DIR . '/tmp/backup/', 0777, true); write_htaccess_deny(BASE_DIR . '/tmp/backup/'); } @file_put_contents(BASE_DIR . '/tmp/backup/'. $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : ''), $dump); @chmod(BASE_DIR . '/tmp/backup/'. $file_name . '.sql', 0777); if (! $exit) header('Location:index.php?do=dbsettings&cp=' . SESSION); else return BASE_DIR . '/tmp/backup/'. $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : ''); } else { // Формируем заголовок header('Content-Type: text/plain'); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Content-Disposition: attachment; filename=' . $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : '')); header('Content-Length: ' . strlen($dump)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // Выводим данные echo $dump; $this->_database_dump = ''; } // Выполняем запись системного сообщения в журнал reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP')); exit; } /** * Метод, предназначенный для сохранения файла дампа базы данных на жеский диск * */ function databaseDumpFileSave($file = '') { global $AVE_Template; $file = BASE_DIR . '/tmp/backup/'. $file; // Если дамп не удалось создать, тогда завершаем работу if (! is_file($file)) return false; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } /** * Метод, предназначенный для восстановления базы данных из дампа * * @param string $tempdir путь к папке в которую загружается файл дампа */ function databaseDumpImport($tempdir) { global $AVE_DB, $AVE_Template; $insert = false; // Если файл не пустой if ($_FILES['file']['size'] != 0) { // Получаем имя файла и его расширение (должно быть sql) $fupload_name = $_FILES['file']['name']; $gz = substr($fupload_name, -3)=='.gz'; $end = substr($fupload_name, -3); // Если расширение sql, тогда if ($gz || $end == 'sql') { // Если файл не удалось загрузить, формируем сообщение с ошибкой if (! @move_uploaded_file($_FILES['file']['tmp_name'], $tempdir . $fupload_name)) die('Ошибка при загрузке файла!'); // Устанавливаем права чтения, записи, выполнения на файл @chmod($fupload_name, 0777); // Определяем флаг готовности к записи данных в БД $insert = true; } else { // В противном случае, если расширение файла НЕ sql, формируем сообщение с ошибкой $AVE_Template->assign('msg', '