Bonjour,
Cette mod permet la Sauvegarde et Restauration de une Base de données sans passer par la méthode classique phpMyAdmin.
le script permet de créer un dossier backup (dossier de sauvegarde), le dump sql, dumper.cfg & une page index.html
scrinshoot:
L'admin peut choisir :
* Sauvegarde la Base de données
* Sauvegarde un Fichier Table
* Type de compression : GZip, BZip2, sans compression
* Taux de compression : 9(maximum), 8, 7,...2, 1(minimum)
* Télécharger la Base de données
* Restauration une Base de données
Installation :
créer un fichier :
dumper.php (uploader le dans le dossier www/)
<?php
/************************************************\
| rU Database Dumper Backup v1.0 |
| Sauvegarde et Restauration DB |
| Adaptation : smed79 |
\************************************************/
define('PATH', '../backup/');
define('URL', '../backup/');
define('TIME_LIMIT', 600);
define('LIMIT', 1);
define('DBHOST', 'localhost:3306');
define('DBNAMES', '');
define('CHARSET', 'auto');
define('RESTORE_CHARSET', 'cp1251');
define('SC', 1);
define('ONLY_CREATE', 'MRG_MyISAM,MERGE,HEAP,MEMORY');
define('GS', 1);
$is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);
header("Expires: Sa, 15 Nov 2008 16:11:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");
$timer = array_sum(explode(' ', microtime()));
ob_implicit_flush();
error_reporting(E_ALL);
$auth = 0;
$error = '';
if (!empty($_POST['login']) && isset($_POST['pass'])) {
if (@mysql_connect(DBHOST, $_POST['login'], $_POST['pass'])){
setcookie("sxd", base64_encode("SKD101:{$_POST['login']}:{$_POST['pass']}"));
header("Location: dumper.php");
mysql_close();
exit;
}
else{
$error = '#' . mysql_errno() . ': ' . mysql_error();
}
}
elseif (!empty($_COOKIE['sxd'])) {
$user = explode(":", base64_decode($_COOKIE['sxd']));
if (@mysql_connect(DBHOST, $user[1], $user[2])){
$auth = 1;
}
else{
$error = '#' . mysql_errno() . ': ' . mysql_error();
}
}
if (!$auth || (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] == 'reload')) {
setcookie("sxd");
echo tpl_page(tpl_auth($error ? tpl_error($error) : ''), "<SCRIPT>if (jsEnabled) {document.write('<INPUT TYPE=submit VALUE=Connexion>');}</SCRIPT>");
echo "<SCRIPT>document.getElementById('timer').innerHTML = 'Page charge en " . round(array_sum(explode(' ', microtime())) - $timer, 4) . " secondes.'</SCRIPT>";
exit;
}
if (!file_exists(PATH) && !$is_safe_mode) {
mkdir(PATH, 0777) || trigger_error("Impossible de créer le répertoire backup", E_USER_ERROR);
}
$SK = new dumper();
define('C_DEFAULT', 1);
define('C_RESULT', 2);
define('C_ERROR', 3);
define('C_WARNING', 4);
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
switch($action){
case 'backup':
$SK->backup();
break;
case 'restore':
$SK->restore();
break;
default:
$SK->main();
}
mysql_close();
echo "<SCRIPT>document.getElementById('timer').innerHTML = 'Page charge en " . round(array_sum(explode(' ', microtime())) - $timer, 4) . " secondes.'</SCRIPT>";
class dumper {
function dumper() {
if (file_exists(PATH . "dumper.cfg.php")) {
include(PATH . "dumper.cfg.php");
}
else{
$this->SET['last_action'] = 0;
$this->SET['last_db_backup'] = '';
$this->SET['tables'] = '';
$this->SET['comp_method'] = 2;
$this->SET['comp_level'] = 7;
$this->SET['last_db_restore'] = '';
}
$this->tabs = 0;
$this->records = 0;
$this->size = 0;
$this->comp = 0;
preg_match("/^(\d+)\.(\d+)\.(\d+)/", mysql_get_server_info(), $m);
$this->mysql_version = sprintf("%d%02d%02d", $m[1], $m[2], $m[3]);
$this->only_create = explode(',', ONLY_CREATE);
$this->forced_charset = false;
$this->restore_charset = $this->restore_collate = '';
if (preg_match("/^(forced->)?(([a-z0-9]+)(\_\w+)?)$/", RESTORE_CHARSET, $matches)) {
$this->forced_charset = $matches[1] == 'forced->';
$this->restore_charset = $matches[3];
$this->restore_collate = !empty($matches[4]) ? ' COLLATE ' . $matches[2] : '';
}
}
function backup() {
if (!isset($_POST)) {$this->main();}
set_error_handler("SXD_errorHandler");
$buttons = "<br /><A ID=save HREF='' STYLE='display: none;'><b>Télécharger<b/></A> <INPUT ID=back TYPE=button VALUE='Retour' DISABLED onClick=\"history.back();\">";
echo tpl_page(tpl_process("Une sauvegarde DB 000 "), $buttons);
$this->SET['last_action'] = 0;
$this->SET['last_db_backup'] = isset($_POST['db_backup']) ? $_POST['db_backup'] : '';
$this->SET['tables_exclude'] = !empty($_POST['tables']) && $_POST['tables']{0} == '^' ? 1 : 0;
$this->SET['tables'] = isset($_POST['tables']) ? $_POST['tables'] : '';
$this->SET['comp_method'] = isset($_POST['comp_method']) ? intval($_POST['comp_method']) : 0;
$this->SET['comp_level'] = isset($_POST['comp_level']) ? intval($_POST['comp_level']) : 0;
$this->fn_save();
$this->SET['tables'] = explode(",", $this->SET['tables']);
if (!empty($_POST['tables'])) {
foreach($this->SET['tables'] AS $table){
$table = preg_replace("/[^\w*?^]/", "", $table);
$pattern = array( "/\?/", "/\*/");
$replace = array( ".", ".*?");
$tbls[] = preg_replace($pattern, $replace, $table);
}
}
else{
$this->SET['tables_exclude'] = 1;
}
if ($this->SET['comp_level'] == 0) {
$this->SET['comp_method'] = 0;
}
$db = $this->SET['last_db_backup'];
if (!$db) {
echo tpl_l("ERREUR! Aucune base de données!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("Connexion à la base de données `{$db}`.");
mysql_select_db($db) or trigger_error ("Impossible de sélectionner la base de données.<BR>" . mysql_error(), E_USER_ERROR);
$tables = array();
$result = mysql_query("SHOW TABLES");
$all = 0;
while($row = mysql_fetch_array($result)) {
$status = 0;
if (!empty($tbls)) {
foreach($tbls AS $table){
$exclude = preg_match("/^\^/", $table) ? true : false;
if (!$exclude) {
if (preg_match("/^{$table}$/i", $row[0])) {
$status = 1;
}
$all = 1;
}
if ($exclude && preg_match("/{$table}$/i", $row[0])) {
$status = -1;
}
}
}
else {
$status = 1;
}
if ($status >= $all) {
$tables[] = $row[0];
}
}
$tabs = count($tables);
$result = mysql_query("SHOW TABLE STATUS");
$tabinfo = array();
$tab_charset = array();
$tab_type = array();
$tabinfo[0] = 0;
$info = '';
while($item = mysql_fetch_assoc($result)){
if(in_array($item['Name'], $tables)) {
$item['Rows'] = empty($item['Rows']) ? 0 : $item['Rows'];
$tabinfo[0] += $item['Rows'];
$tabinfo[$item['Name']] = $item['Rows'];
$this->size += $item['Data_length'];
$tabsize[$item['Name']] = 1 + round(LIMIT * 1048576 / ($item['Avg_row_length'] + 1));
if($item['Rows']) $info .= "|" . $item['Rows'];
if (!empty($item['Collation']) && preg_match("/^([a-z0-9]+)_/i", $item['Collation'], $m)) {
$tab_charset[$item['Name']] = $m[1];
}
$tab_type[$item['Name']] = isset($item['Engine']) ? $item['Engine'] : $item['Type'];
}
}
$show = 10 + $tabinfo[0] / 50;
$info = $tabinfo[0] . $info;
$name = $db . '_' . date("Y-m-d_H-i");
$fp = $this->fn_open($name, "w");
echo tpl_l("Créer un fichier de sauvegarde DB:<BR>\\n - {$this->filename}");
$this->fn_write($fp, "#SKD101|{$db}|{$tabs}|" . date("Y.m.d H:i:s") ."|{$info}\n\n");
$t=0;
echo tpl_l(str_repeat("-", 60));
$result = mysql_query("SET SQL_QUOTE_SHOW_CREATE = 1");
if ($this->mysql_version > 40101 && CHARSET != 'auto') {
mysql_query("SET NAMES '" . CHARSET . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>" . mysql_error(), E_USER_ERROR);
$last_charset = CHARSET;
}
else{
$last_charset = '';
}
foreach ($tables AS $table){
if ($this->mysql_version > 40101 && $tab_charset[$table] != $last_charset) {
if (CHARSET == 'auto') {
mysql_query("SET NAMES '" . $tab_charset[$table] . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>" . mysql_error(), E_USER_ERROR);
echo tpl_l("Un codage des composés `" . $tab_charset[$table] . "`.", C_WARNING);
$last_charset = $tab_charset[$table];
}
else{
echo tpl_l('Le cryptage et le tableau de connexion ne correspond pas à:', C_ERROR);
echo tpl_l('Table `'. $table .'` -> ' . $tab_charset[$table] . ' (Connexion ' . CHARSET . ')', C_ERROR);
}
}
echo tpl_l("Manipulation de table `{$table}` [" . fn_int($tabinfo[$table]) . "].");
$result = mysql_query("SHOW CREATE TABLE `{$table}`");
$tab = mysql_fetch_array($result);
$tab = preg_replace('/(default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP|DEFAULT CHARSET=\w+|COLLATE=\w+|character set \w+|collate \w+)/i', '/*!40101 \\1 */', $tab);
$this->fn_write($fp, "DROP TABLE IF EXISTS `{$table}`;\n{$tab[1]};\n\n");
if (in_array($tab_type[$table], $this->only_create)) {
continue;
}
$NumericColumn = array();
$result = mysql_query("SHOW COLUMNS FROM `{$table}`");
$field = 0;
while($col = mysql_fetch_row($result)) {
$NumericColumn[$field++] = preg_match("/^(\w*int|year)/", $col[1]) ? 1 : 0;
}
$fields = $field;
$from = 0;
$limit = $tabsize[$table];
$limit2 = round($limit / 3);
if ($tabinfo[$table] > 0) {
if ($tabinfo[$table] > $limit2) {
echo tpl_s(0, $t / $tabinfo[0]);
}
$i = 0;
$this->fn_write($fp, "INSERT INTO `{$table}` VALUES");
while(($result = mysql_query("SELECT * FROM `{$table}` LIMIT {$from}, {$limit}")) && ($total = mysql_num_rows($result))){
while($row = mysql_fetch_row($result)) {
$i++;
$t++;
for($k = 0; $k < $fields; $k++){
if ($NumericColumn[$k])
$row[$k] = isset($row[$k]) ? $row[$k] : "NULL";
else
$row[$k] = isset($row[$k]) ? "'" . mysql_escape_string($row[$k]) . "'" : "NULL";
}
$this->fn_write($fp, ($i == 1 ? "" : ",") . "\n(" . implode(", ", $row) . ")");
if ($i % $limit2 == 0)
echo tpl_s($i / $tabinfo[$table], $t / $tabinfo[0]);
}
mysql_free_result($result);
if ($total < $limit) {
break;
}
$from += $limit;
}
$this->fn_write($fp, ";\n\n");
echo tpl_s(1, $t / $tabinfo[0]);}
}
$this->tabs = $tabs;
$this->records = $tabinfo[0];
$this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level'];
echo tpl_s(1, 1);
echo tpl_l(str_repeat("-", 60));
$this->fn_close($fp);
echo tpl_l("Backup DB `{$db}` un.", C_RESULT);
echo tpl_l("Taille de la base de données: " . round($this->size / 1048576, 2) . " MB", C_RESULT);
$filesize = round(filesize(PATH . $this->filename) / 1048576, 2) . " MB";
echo tpl_l("Taille du fichier: {$filesize}", C_RESULT);
echo tpl_l("Tables traitées: {$tabs}", C_RESULT);
echo tpl_l("Lignes traitées: " . fn_int($tabinfo[0]), C_RESULT);
echo "<SCRIPT>with (document.getElementById('save')) {style.display = ''; innerHTML = 'Télécharger ({$filesize})'; href = '" . URL . $this->filename . "'; }document.getElementById('back').disabled = 0;</SCRIPT>";
}
function restore(){
if (!isset($_POST)) {$this->main();}
set_error_handler("SXD_errorHandler");
$buttons = "<INPUT ID=back TYPE=button VALUE='Retour' DISABLED onClick=\"history.back();\">";
echo tpl_page(tpl_process("Restauration de la base de données à partir d'une sauvegarde"), $buttons);
$this->SET['last_action'] = 1;
$this->SET['last_db_restore'] = isset($_POST['db_restore']) ? $_POST['db_restore'] : '';
$file = isset($_POST['file']) ? $_POST['file'] : '';
$this->fn_save();
$db = $this->SET['last_db_restore'];
if (!$db) {
echo tpl_l("ERREUR! Aucune base de données!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("Connexion à la base de données `{$db}`.");
mysql_select_db($db) or trigger_error ("Impossible de sélectionner la base de données.<BR>" . mysql_error(), E_USER_ERROR);
if(preg_match("/^(.+?)\.sql(\.(bz2|gz))?$/", $file, $matches)) {
if (isset($matches[3]) && $matches[3] == 'bz2') {
$this->SET['comp_method'] = 2;
}
elseif (isset($matches[2]) &&$matches[3] == 'gz'){
$this->SET['comp_method'] = 1;
}
else{
$this->SET['comp_method'] = 0;
}
$this->SET['comp_level'] = '';
if (!file_exists(PATH . "/{$file}")) {
echo tpl_l("ERREUR! Fichier non trouvé!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("La lecture du fichier `{$file}`.");
$file = $matches[1];
}
else{
echo tpl_l("ERREUR! Vous n\'avez pas sélectionné un fichier!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l(str_repeat("-", 60));
$fp = $this->fn_open($file, "r");
$this->file_cache = $sql = $table = $insert = '';
$is_skd = $query_len = $execute = $q =$t = $i = $aff_rows = 0;
$limit = 300;
$index = 4;
$tabs = 0;
$cache = '';
$info = array();
if ($this->mysql_version > 40101 && (CHARSET != 'auto' || $this->forced_charset)) {
mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>" . mysql_error(), E_USER_ERROR);
echo tpl_l("Un codage des composés `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
else {
$last_charset = '';
}
$last_showed = '';
while(($str = $this->fn_read_str($fp)) !== false){
if (empty($str) || preg_match("/^(#|--)/", $str)) {
if (!$is_skd && preg_match("/^#SKD101\|/", $str)) {
$info = explode("|", $str);
echo tpl_s(0, $t / $info[4]);
$is_skd = 1;
}
continue;
}
$query_len += strlen($str);
if (!$insert && preg_match("/^(INSERT INTO `?([^` ]+)`? .*?VALUES)(.*)$/i", $str, $m)) {
if ($table != $m[2]) {
$table = $m[2];
$tabs++;
$cache .= tpl_l("Table `{$table}`.");
$last_showed = $table;
$i = 0;
if ($is_skd)
echo tpl_s(100 , $t / $info[4]);
}
$insert = $m[1] . ' ';
$sql .= $m[3];
$index++;
$info[$index] = isset($info[$index]) ? $info[$index] : 0;
$limit = round($info[$index] / 20);
$limit = $limit < 300 ? 300 : $limit;
if ($info[$index] > $limit){
echo $cache;
$cache = '';
echo tpl_s(0 / $info[$index], $t / $info[4]);
}
}
else{
$sql .= $str;
if ($insert) {
$i++;
$t++;
if ($is_skd && $info[$index] > $limit && $t % $limit == 0){
echo tpl_s($i / $info[$index], $t / $info[4]);
}
}
}
if (!$insert && preg_match("/^CREATE TABLE (IF NOT EXISTS )?`?([^` ]+)`?/i", $str, $m) && $table != $m[2]){
$table = $m[2];
$insert = '';
$tabs++;
$is_create = true;
$i = 0;
}
if ($sql) {
if (preg_match("/;$/", $str)) {
$sql = rtrim($insert . $sql, ";");
if (empty($insert)) {
if ($this->mysql_version < 40101) {
$sql = preg_replace("/ENGINE\s?=/", "TYPE=", $sql);
}
elseif (preg_match("/CREATE TABLE/i", $sql)){
if (preg_match("/(CHARACTER SET|CHARSET)[=\s]+(\w+)/i", $sql, $charset)) {
if (!$this->forced_charset && $charset[2] != $last_charset) {
if (CHARSET == 'auto') {
mysql_query("SET NAMES '" . $charset[2] . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
$cache .= tpl_l("Un codage des composés `" . $charset[2] . "`.", C_WARNING);
$last_charset = $charset[2];
}
else{
$cache .= tpl_l('Le cryptage et le tableau de connexion ne correspond pas à:', C_ERROR);
$cache .= tpl_l('Table `'. $table .'` -> ' . $charset[2] . ' (Connexion ' . $this->restore_charset . ')', C_ERROR);
}
}
if ($this->forced_charset) {
$sql = preg_replace("/(\/\*!\d+\s)?((COLLATE)[=\s]+)\w+(\s+\*\/)?/i", '', $sql);
$sql = preg_replace("/((CHARACTER SET|CHARSET)[=\s]+)\w+/i", "\\1" . $this->restore_charset . $this->restore_collate, $sql);
}
}
elseif(CHARSET == 'auto'){
$sql .= ' DEFAULT CHARSET=' . $this->restore_charset . $this->restore_collate;
if ($this->restore_charset != $last_charset) {
mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
$cache .= tpl_l("Un codage des composés `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
}
}
if ($last_showed != $table) {$cache .= tpl_l("Table `{$table}`."); $last_showed = $table;}
}
elseif($this->mysql_version > 40101 && empty($last_charset)) {
mysql_query("SET $this->restore_charset '" . $this->restore_charset . "'") or trigger_error ("Neudaetsya changer l'encodage des composés.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
echo tpl_l("Un codage des composé `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
$insert = '';
$execute = 1;
}
if ($query_len >= 65536 && preg_match("/,$/", $str)) {
$sql = rtrim($insert . $sql, ",");
$execute = 1;
}
if ($execute) {
$q++;
mysql_query($sql) or trigger_error ("Mauvaise Requete.<BR>" . mysql_error(), E_USER_ERROR);
if (preg_match("/^insert/i", $sql)) {
$aff_rows += mysql_affected_rows();
}
$sql = '';
$query_len = 0;
$execute = 0;
}
}
}
echo $cache;
echo tpl_s(1 , 1);
echo tpl_l(str_repeat("-", 60));
echo tpl_l("Restaurée DB à partir d'une sauvegarde.", C_RESULT);
if (isset($info[3])) echo tpl_l("Date de copies: {$info[3]}", C_RESULT);
echo tpl_l("Interroger la base de données: {$q}", C_RESULT);
echo tpl_l("Tables mettre en place: {$tabs}", C_RESULT);
echo tpl_l("Lignes: {$aff_rows}", C_RESULT);
$this->tabs = $tabs;
$this->records = $aff_rows;
$this->size = filesize(PATH . $this->filename);
$this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level'];
echo "<SCRIPT>document.getElementById('back').disabled = 0;</SCRIPT>";
if (GS) echo "<SCRIPT>document.getElementById('GS').src = 'http://sypex.net/gs.php?r={$this->tabs},{$this->records},{$this->size},{$this->comp},108';</SCRIPT>";
$this->fn_close($fp);
}
function main(){
$this->comp_levels = array('9' => '9 (maximum)', '8' => '8', '7' => '7', '6' => '6', '5' => '5 (moyenne)', '4' => '4', '3' => '3', '2' => '2', '1' => '1 (minimum )','0' => 'sans compression');
if (function_exists("bzopen")) {
$this->comp_methods[2] = 'BZip2';
}
if (function_exists("gzopen")) {
$this->comp_methods[1] = 'GZip';
}
$this->comp_methods[0] = 'sans compression';
if (count($this->comp_methods) == 1) {
$this->comp_levels = array('0' =>'sans compression');
}
$dbs = $this->db_select();
$this->vars['db_backup'] = $this->fn_select($dbs, $this->SET['last_db_backup']);
$this->vars['db_restore'] = $this->fn_select($dbs, $this->SET['last_db_restore']);
$this->vars['comp_levels'] = $this->fn_select($this->comp_levels, $this->SET['comp_level']);
$this->vars['comp_methods'] = $this->fn_select($this->comp_methods, $this->SET['comp_method']);
$this->vars['tables'] = $this->SET['tables'];
$this->vars['files'] = $this->fn_select($this->file_select(), '');
$buttons = "<INPUT TYPE=submit VALUE=Appliquer><INPUT TYPE=button VALUE=Retour onClick=\"location.href = 'dumper.php?reload'\">";
echo tpl_page(tpl_main(), $buttons);
}
function db_select(){
if (DBNAMES != '') {
$items = explode(',', trim(DBNAMES));
foreach($items AS $item){
if (mysql_select_db($item)) {
$tables = mysql_query("SHOW TABLES");
if ($tables) {
$tabs = mysql_num_rows($tables);
$dbs[$item] = "{$item} ({$tabs})";
}
}
}
}
else {
$result = mysql_query("SHOW DATABASES");
$dbs = array();
while($item = mysql_fetch_array($result)){
if (mysql_select_db($item[0])) {
$tables = mysql_query("SHOW TABLES");
if ($tables) {
$tabs = mysql_num_rows($tables);
$dbs[$item[0]] = "{$item[0]} ({$tabs})";
}
}
}
}
return $dbs;
}
function file_select(){
$files = array('' => ' ');
if (is_dir(PATH) && $handle = opendir(PATH)) {
while (false !== ($file = readdir($handle))) {
if (preg_match("/^.+?\.sql(\.(gz|bz2))?$/", $file)) {
$files[$file] = $file;
}
}
closedir($handle);
}
ksort($files);
return $files;
}
function fn_open($name, $mode){
if ($this->SET['comp_method'] == 2) {
$this->filename = "{$name}.sql.bz2";
return bzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}");
}
elseif ($this->SET['comp_method'] == 1) {
$this->filename = "{$name}.sql.gz";
return gzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}");
}
else{
$this->filename = "{$name}.sql";
return fopen(PATH . $this->filename, "{$mode}b");
}
}
function fn_write($fp, $str){
if ($this->SET['comp_method'] == 2) {
bzwrite($fp, $str);
}
elseif ($this->SET['comp_method'] == 1) {
gzwrite($fp, $str);
}
else{
fwrite($fp, $str);
}
}
function fn_read($fp){
if ($this->SET['comp_method'] == 2) {
return bzread($fp, 4096);
}
elseif ($this->SET['comp_method'] == 1) {
return gzread($fp, 4096);
}
else{
return fread($fp, 4096);
}
}
function fn_read_str($fp){
$string = '';
$this->file_cache = ltrim($this->file_cache);
$pos = strpos($this->file_cache, "\n", 0);
if ($pos < 1) {
while (!$string && ($str = $this->fn_read($fp))){
$pos = strpos($str, "\n", 0);
if ($pos === false) {
$this->file_cache .= $str;
}
else{
$string = $this->file_cache . substr($str, 0, $pos);
$this->file_cache = substr($str, $pos + 1);
}
}
if (!$str) {
if ($this->file_cache) {
$string = $this->file_cache;
$this->file_cache = '';
return trim($string);
}
return false;
}
}
else {
$string = substr($this->file_cache, 0, $pos);
$this->file_cache = substr($this->file_cache, $pos + 1);
}
return trim($string);
}
function fn_close($fp){
if ($this->SET['comp_method'] == 2) {
bzclose($fp);
}
elseif ($this->SET['comp_method'] == 1) {
gzclose($fp);
}
else{
fclose($fp);
}
@chmod(PATH . $this->filename, 0666);
$this->fn_index();
}
function fn_select($items, $selected){
$select = '';
foreach($items AS $key => $value){
$select .= $key == $selected ? "<OPTION VALUE='{$key}' SELECTED>{$value}" : "<OPTION VALUE='{$key}'>{$value}";
}
return $select;
}
function fn_save(){
if (SC) {
$ne = !file_exists(PATH . "dumper.cfg.php");
$fp = fopen(PATH . "dumper.cfg.php", "wb");
fwrite($fp, "<?php\n\$this->SET = " . fn_arr2str($this->SET) . "\n?>");
fclose($fp);
if ($ne) @chmod(PATH . "dumper.cfg.php", 0666);
$this->fn_index();
}
}
function fn_index(){
if (!file_exists(PATH . 'index.html')) {
$fh = fopen(PATH . 'index.html', 'wb');
fwrite($fh, tpl_backup_index());
fclose($fh);
@chmod(PATH . 'index.html', 0666);
}
}
}
function fn_int($num){
return number_format($num, 0, ',', ' ');
}
function fn_arr2str($array) {
$str = "array(\n";
foreach ($array as $key => $value) {
if (is_array($value)) {
$str .= "'$key' => " . fn_arr2str($value) . ",\n\n";
}
else {
$str .= "'$key' => '" . str_replace("'", "\'", $value) . "',\n";
}
}
return $str . ")";
}
function tpl_page($content = '', $buttons = ''){
return <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Database Dumper Backup | smed79</TITLE>
<META HTTP-EQUIV=Content-Type CONTENT="text/html; charset=windows-1251">
<STYLE TYPE="TEXT/CSS">
<!--
body{
overflow: auto;
}
td {
font: 11px tahoma, verdana, arial;
cursor: default;
}
input, select, div {
font: 11px tahoma, verdana, arial;
}
input.text, select {
width: 100%;
}
fieldset {
margin-bottom: 5px;
}
-->
</STYLE>
</HEAD>
<BODY BGCOLOR=#ECE9D8 TEXT=#000000>
<TABLE WIDTH=100% HEIGHT=100% BORDER=0 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>
<TR>
<TD HEIGHT=60% ALIGN=CENTER VALIGN=MIDDLE>
<TABLE WIDTH=360 BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD VALIGN=TOP STYLE="border: 1px solid #919B9C;">
<TABLE WIDTH=100% HEIGHT=100% BORDER=0 CELLSPACING=1 CELLPADDING=0>
<TR>
<TD ID=Header HEIGHT=2 BGCOLOR=#7A96DF STYLE="font-size: 13px; color: white; font-family: verdana, arial;
padding-left: 5px; FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=1,startColorStr=#7A96DF,endColorStr=#FBFBFD)"
TITLE='Database Dumper Backup © 2003-2006 | smed79'>
<B><A HREF="#" STYLE="color: white; text-decoration: none;">Database Dumper Backup | smed79</A></B><IMG ID=GS WIDTH=1 HEIGHT=1 STYLE="visibility: hidden;"></TD>
</TR>
<TR>
<FORM NAME=skb METHOD=POST ACTION=dumper.php>
<TD VALIGN=TOP BGCOLOR=#F4F3EE STYLE="FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#FCFBFE,endColorStr=#F4F3EE); padding: 4px 4px;">
{$content}
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD STYLE='color: #CECECE' ID=timer></TD>
<TD ALIGN=RIGHT>{$buttons}</TD>
</TR>
</TABLE></TD>
</FORM>
</TR>
</TABLE></TD><TABLE><TR><TD><center><br><INPUT ID=back TYPE=button VALUE='Fermer' Enabel onClick="javascript:window.close();"></center></TD></TR></TABLE>
</TR>
</TABLE></TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
HTML;
}
function tpl_main(){
global $SK;
return <<<HTML
<FIELDSET onClick="document.skb.action[0].checked = 1;">
<LEGEND>
<INPUT TYPE=radio NAME=action VALUE=backup>
Backup / Sauvegarder la base de donneés</LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD WIDTH=35%>Nom de donneés:</TD>
<TD WIDTH=65%><SELECT NAME=db_backup>
{$SK->vars['db_backup']}
</SELECT></TD>
</TR>
<TR>
<TD>Fichier Table:</TD>
<TD><INPUT NAME=tables TYPE=text CLASS=text VALUE='{$SK->vars['tables']}'></TD>
</TR>
<TR>
<TD>Type de compression:</TD>
<TD><SELECT NAME=comp_method>
{$SK->vars['comp_methods']}
</SELECT></TD>
</TR>
<TR>
<TD>Taux de compression:</TD>
<TD><SELECT NAME=comp_level>
{$SK->vars['comp_levels']}
</SELECT></TD>
</TR>
</TABLE>
</FIELDSET>
<FIELDSET onClick="document.skb.action[1].checked = 1;">
<LEGEND>
<INPUT TYPE=radio NAME=action VALUE=restore>
Restore / Restaurer la base de donneés</LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD>Nom de la base de donneés:</TD>
<TD><SELECT NAME=db_restore>
{$SK->vars['db_restore']}
</SELECT></TD>
</TR>
<TR>
<TD WIDTH=35%>Fichier:</TD>
<TD WIDTH=65%><SELECT NAME=file>
{$SK->vars['files']}
</SELECT></TD>
</TR>
</TABLE>
</FIELDSET>
</SPAN>
<SCRIPT>
document.skb.action[{$SK->SET['last_action']}].checked = 1;
</SCRIPT>
HTML;
}
function tpl_process($title){
return <<<HTML
<FIELDSET>
<LEGEND>{$title} </LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR><TD COLSPAN=2><DIV ID=logarea STYLE="width: 100%; height: 110px; border: 1px solid #7F9DB9; padding: 3px; overflow: auto;"></DIV></TD></TR>
<TR><TD WIDTH=31%>Situation tableau:</TD><TD WIDTH=69%><TABLE WIDTH=100% BORDER=1 CELLPADDING=0 CELLSPACING=0>
<TR><TD BGCOLOR=#FFFFFF><TABLE WIDTH=1 BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR=#5555CC ID=st_tab
STYLE="FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#CCCCFF,endColorStr=#5555CC);
border-right: 1px solid #AAAAAA"><TR><TD HEIGHT=12></TD></TR></TABLE></TD></TR></TABLE></TD></TR>
<TR><TD>L'état général:</TD><TD><TABLE WIDTH=100% BORDER=1 CELLSPACING=0 CELLPADDING=0>
<TR><TD BGCOLOR=#FFFFFF><TABLE WIDTH=1 BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR=#00AA00 ID=so_tab
STYLE="FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#CCFFCC,endColorStr=#00AA00);
border-right: 1px solid #AAAAAA"><TR><TD HEIGHT=12></TD></TR></TABLE></TD>
</TR></TABLE></TD></TR></TABLE>
</FIELDSET>
<SCRIPT>
var WidthLocked = false;
function s(st, so){
document.getElementById('st_tab').width = st ? st + '%' : '1';
document.getElementById('so_tab').width = so ? so + '%' : '1';
}
function l(str, color){
switch(color){
case 2: color = 'navy'; break;
case 3: color = 'red'; break;
case 4: color = 'maroon'; break;
default: color = 'black';
}
with(document.getElementById('logarea')){
if (!WidthLocked){
style.width = clientWidth;
WidthLocked = true;
}
str = '<FONT COLOR=' + color + '>' + str + '</FONT>';
innerHTML += innerHTML ? "<BR>\\n" + str : str;
scrollTop += 14;
}
}
</SCRIPT>
HTML;
}
function tpl_auth($error){
return <<<HTML
<SPAN ID=error>
<FIELDSET>
<LEGEND>Erreur</LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD>Database Dumper Backup | smed79:<BR> - Internet Explorer 5.5+, Mozilla si Opera 8+ (<SPAN ID=sie>-</SPAN>)<BR> - y compris le respect JavaScript scripts (<SPAN ID=sjs>-</SPAN>)</TD>
</TR>
</TABLE>
</FIELDSET>
</SPAN>
<SPAN ID=body STYLE="display: none;">
{$error}
<FIELDSET>
<LEGEND>Entrez le Nom et le mot-de-passe de la base de donneés :</LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD WIDTH=41%>Nom d'utilisateur :</TD>
<TD WIDTH=59%><INPUT NAME=login TYPE=text CLASS=text></TD>
</TR>
<TR>
<TD>Mot de passe :</TD>
<TD><INPUT NAME=pass TYPE=password CLASS=text></TD>
</TR>
</TABLE>
</FIELDSET>
</SPAN>
<SCRIPT>
document.getElementById('sjs').innerHTML = '+';
document.getElementById('body').style.display = '';
document.getElementById('error').style.display = 'none';
var jsEnabled = true;
</SCRIPT>
HTML;
}
function tpl_l($str, $color = C_DEFAULT){
$str = preg_replace("/\s{2}/", " ", $str);
return <<<HTML
<SCRIPT>l('{$str}', $color);</SCRIPT>
HTML;
}
function tpl_enableBack(){
return <<<HTML
<SCRIPT>document.getElementById('back').disabled = 0;</SCRIPT>
HTML;
}
function tpl_s($st, $so){
$st = round($st * 100);
$st = $st > 100 ? 100 : $st;
$so = round($so * 100);
$so = $so > 100 ? 100 : $so;
return <<<HTML
<SCRIPT>s({$st},{$so});</SCRIPT>
HTML;
}
function tpl_backup_index(){
return <<<HTML
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta http-equiv=refresh content=3;url=../>
<title>Access denied!</title>
</head>
<body>
<table width="500" border="0" cellspacing="1" cellpadding="4" align="center" valign="top" class="geo_track_redirect_class">
<tr>
<td>
<br>
<font style='font-size:40px;'>
<b>access denied!</b>
</font>
<br />
<b>You will be redirected shortly...</b>
<br /><br /><br />
<b>smed79 ;)</b>
<br>
</td>
</tr>
</table>
</body>
</html>
HTML;
}
function tpl_error($error){
return <<<HTML
<FIELDSET>
<LEGEND>Erreur lors de la connexion à la base de données</LEGEND>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=2>
<TR>
<TD ALIGN=center>{$error}</TD>
</TR>
</TABLE>
</FIELDSET>
HTML;
}
function SXD_errorHandler($errno, $errmsg, $filename, $linenum, $vars) {
if ($errno == 2048) return true;
if (preg_match("/chmod\(\).*?: Operation not permitted/", $errmsg)) return true;
$dt = date("Y.m.d H:i:s");
$errmsg = addslashes($errmsg);
echo tpl_l("{$dt}<BR><B>Il ya eu une erreur!</B>", C_ERROR);
echo tpl_l("{$errmsg} ({$errno})", C_ERROR);
echo tpl_enableBack();
die();
}
?>
uploader le fichier dumper.php dans le dossier www/
ajout d'un lien dans le <gras>Menu Administration</gras>.
<a href="Dumper" onclick="window.open('./dumper.php','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=0, resizable=0, copyhistory=0, menuBar=0, width=420, height=330, left=320, top=190');return(false)"><font style="color:red"><b>SQL Dumper</b></font></a>
/!\ important /!\
si le serveur de votre base de donnée n'ai pas sur le meme serveur, edité le fichier dumper.php a la ligne 14 modifier le serveur et le port.
après le test du mod n'oubliez pas de dir merci !
-->Message édité par smed79 le 16/11/2008 14:29:51<--