backup.php

来自「this the oscommerce 3.0 aplha 4」· PHP 代码 · 共 378 行

PHP
378
字号
<?php/*  $Id: $  osCommerce, Open Source E-Commerce Solutions  http://www.oscommerce.com  Copyright (c) 2007 osCommerce  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License v2 (1991)  as published by the Free Software Foundation.*/  class osC_Backup_Admin {    function backup($compression = null, $download_only = false) {      global $osC_Database;      if ( osc_empty(DIR_FS_BACKUP) || !is_dir(DIR_FS_BACKUP) || !is_writeable(DIR_FS_BACKUP) ) {        return false;      }      osc_set_time_limit(0);      $backup_file = 'db_' . DB_DATABASE . '-' . date('YmdHis') . '.sql';      $fp = fopen(DIR_FS_BACKUP . $backup_file, 'w');      $schema = '# osCommerce, Open Source E-Commerce Solutions' . "\n" .                '# http://www.oscommerce.com' . "\n" .                '#' . "\n" .                '# Database Backup For ' . STORE_NAME . "\n" .                '# Copyright (c) ' . date('Y') . ' ' . STORE_OWNER . "\n" .                '#' . "\n" .                '# Database: ' . DB_DATABASE . "\n" .                '# Database Server: ' . DB_SERVER . "\n" .                '#' . "\n" .                '# Backup Date: ' . osC_DateTime::getShort(null, true) . "\n\n";      fputs($fp, $schema);      $Qtables = $osC_Database->query('show tables');      while ( $Qtables->next() ) {        $table = $Qtables->value('Tables_in_' . DB_DATABASE);        $schema = 'drop table if exists ' . $table . ';' . "\n" .                  'create table ' . $table . ' (' . "\n";        $table_list = array();        $Qfields = $osC_Database->query('show fields from :table');        $Qfields->bindTable(':table', $table);        $Qfields->execute();        while ( $Qfields->next() ) {          $table_list[] = $Qfields->value('Field');          $schema .= '  ' . $Qfields->value('Field') . ' ' . $Qfields->value('Type');          if ( !osc_empty($Qfields->value('Default')) ) {            $schema .= ' default \'' . $Qfields->value('Default') . '\'';          }          if ( $Qfields->value('Null') != 'YES' ) {            $schema .= ' not null';          }          if ( !osc_empty($Qfields->value('Extra')) ) {            $schema .= ' ' . $Qfields->value('Extra');          }          $schema .= ',' . "\n";        }        $schema = ereg_replace(",\n$", '', $schema);// add the keys        $Qkeys = $osC_Database->query('show keys from :table');        $Qkeys->bindTable(':table', $table);        $Qkeys->execute();        $index = array();        while ( $Qkeys->next() ) {          $kname = $Qkeys->value('Key_name');          if ( !isset($index[$kname]) ) {            $index[$kname] = array('unique' => !$Qkeys->value('Non_unique'),                                   'fulltext' => ($Qkeys->value('Index_type') == 'FULLTEXT' ? true : false),                                   'columns' => array());          }          $index[$kname]['columns'][] = $Qkeys->value('Column_name');        }        foreach ( $index as $kname => $info ) {          $schema .= ',' . "\n";          $columns = implode($info['columns'], ', ');          if ( $kname == 'PRIMARY' ) {            $schema .= '  PRIMARY KEY (' . $columns . ')';          } elseif ( $info['fulltext'] === true ) {            $schema .= '  FULLTEXT ' . $kname . ' (' . $columns . ')';          } elseif ( $info['unique'] ) {            $schema .= '  UNIQUE ' . $kname . ' (' . $columns . ')';          } else {            $schema .= '  KEY ' . $kname . ' (' . $columns . ')';          }        }        $schema .= "\n" . ');' . "\n\n";        fputs($fp, $schema);// dump the data from the tables except from the sessions table and the who's online table        if ( ( $table != TABLE_SESSIONS ) && ( $table != TABLE_WHOS_ONLINE ) ) {          $Qrows = $osC_Database->query('select :columns from :table');          $Qrows->bindRaw(':columns', implode(', ', $table_list));          $Qrows->bindTable(':table', $table);          $Qrows->execute();          while ( $Qrows->next() ) {            $rows = $Qrows->toArray();            $schema = 'insert into ' . $table . ' (' . implode(', ', $table_list) . ') values (';            foreach ( $table_list as $i ) {              if ( !isset($rows[$i]) ) {                $schema .= 'NULL, ';              } elseif ( strlen($rows[$i]) > 0 ) {                $row = addslashes($rows[$i]);                $row = ereg_replace("\n#", "\n".'\#', $row);                $schema .= '\'' . $row . '\', ';              } else {                $schema .= '\'\', ';              }            }            $schema = ereg_replace(', $', '', $schema) . ');' . "\n";            fputs($fp, $schema);          }        }      }      fclose($fp);      unset($schema);      switch ( $compression ) {        case 'gzip':          exec(CFG_APP_GZIP . ' ' . DIR_FS_BACKUP . $backup_file);          $backup_file .= '.gz';          break;        case 'zip':          exec(CFG_APP_ZIP . ' -j ' . DIR_FS_BACKUP . $backup_file . '.zip ' . DIR_FS_BACKUP . $backup_file);          unlink(DIR_FS_BACKUP . $backup_file);          $backup_file .= '.zip';          break;      }      if ( $download_only === true ) {        header('Content-type: application/x-octet-stream');        header('Content-disposition: attachment; filename=' . $backup_file);        readfile(DIR_FS_BACKUP . $backup_file);        unlink(DIR_FS_BACKUP . $backup_file);        exit;      }      if ( file_exists(DIR_FS_BACKUP . $backup_file) ) {        return true;      }      return false;    }    function restore($filename = false) {      global $osC_Database, $osC_Session;      osc_set_time_limit(0);      if ( $filename !== false ) {        if ( file_exists(DIR_FS_BACKUP . $filename) ) {          $restore_file = DIR_FS_BACKUP . $filename;          $extension = substr($filename, -3);          if ( ( $extension == 'sql' ) || ( $extension == '.gz' ) || ( $extension == 'zip' ) ) {            switch ( $extension ) {              case 'sql':                $restore_from = $restore_file;                $remove_raw = false;                break;              case '.gz':                $restore_from = substr($restore_file, 0, -3);                exec(CFG_APP_GUNZIP . ' ' . $restore_file . ' -c > ' . $restore_from);                $remove_raw = true;                break;              case 'zip':                $restore_from = substr($restore_file, 0, -4);                exec(CFG_APP_UNZIP . ' ' . $restore_file . ' -d ' . DIR_FS_BACKUP);                $remove_raw = true;                break;            }            if ( isset($restore_from) && file_exists($restore_from) ) {              $fd = fopen($restore_from, 'rb');              $restore_query = fread($fd, filesize($restore_from));              fclose($fd);            }          }        }      } else {        $sql_file = new upload('sql_file');        $sql_file->set_output_messages('session');        if ( $sql_file->parse() ) {          $restore_query = fread(fopen($sql_file->tmp_filename, 'r'), filesize($sql_file->tmp_filename));          $filename = $sql_file->filename;        }      }      if ( isset($restore_query) && !empty($restore_query) ) {        $sql_array = array();        $sql_length = strlen($restore_query);        $pos = strpos($restore_query, ';');        for ( $i = $pos; $i < $sql_length; $i++ ) {          if ( $restore_query[0] == '#' ) {            $restore_query = ltrim(substr($restore_query, strpos($restore_query, "\n")));            $sql_length = strlen($restore_query);            $i = strpos($restore_query, ';')-1;            continue;          }          if ( $restore_query[($i+1)] == "\n" ) {            for ( $j = ($i + 2); $j < $sql_length; $j++ ) {              if ( trim($restore_query[$j]) != '' ) {                $next = substr($restore_query, $j, 6);                if ( $next[0] == '#' ) {// find out where the break position is so we can remove this line (#comment line)                  for ( $k = $j; $k < $sql_length; $k++ ) {                    if ( $restore_query[$k] == "\n" ) {                      break;                    }                  }                  $query = substr($restore_query, 0, $i+1);                  $restore_query = substr($restore_query, $k);// join the query before the comment appeared, with the rest of the dump                  $restore_query = $query . $restore_query;                  $sql_length = strlen($restore_query);                  $i = strpos($restore_query, ';')-1;                  continue 2;                }                break;              }            }            if ( $next == '' ) { // get the last insert query              $next = 'insert';            }            if ( eregi('create', $next) || eregi('insert', $next) || eregi('drop t', $next) ) {              $next = '';              $sql_array[] = substr($restore_query, 0, $i);              $restore_query = ltrim(substr($restore_query, $i+1));              $sql_length = strlen($restore_query);              $i = strpos($restore_query, ';')-1;            }          }        }// drop all tables defined in oscommerce/includes/database_tables.php        $tables_array = array();        foreach ( get_defined_constants() as $key => $value) {          if ( substr($key, 0, 6) == 'TABLE_') {            $tables_array[] = $value;          }        }        if ( !empty($tables_array) ) {          $Qdrop = $osC_Database->query('drop table if exists :tables');          $Qdrop->bindRaw(':tables', implode(', ', $tables_array));          $Qdrop->execute();        }        for ( $i = 0, $n = sizeof($sql_array); $i < $n; $i++ ) {          $osC_Database->simpleQuery($sql_array[$i]);        }        $osC_Session->close();// empty the sessions table        $Qsessions = $osC_Database->query('delete from :table_sessions');        $Qsessions->bindTable(':table_sessions', TABLE_SESSIONS);        $Qsessions->execute();// empty the who's online table        $Qwho = $osC_Database->query('delete from :table_whos_online');        $Qwho->bindTable(':table_whos_online', TABLE_WHOS_ONLINE);        $Qwho->execute();        $Qcfg = $osC_Database->query('delete from :table_configuration where configuration_key = :configuration_key');        $Qcfg->bindTable(':table_configuration', TABLE_CONFIGURATION);        $Qcfg->bindValue(':configuration_key', 'DB_LAST_RESTORE');        $Qcfg->execute();        $Qcfg = $osC_Database->query('insert into :table_configuration values ("", "Last Database Restore", "DB_LAST_RESTORE", :filename, "Last database restore file", "6", "", "", now(), "", "")');        $Qcfg->bindTable(':table_configuration', TABLE_CONFIGURATION);        $Qcfg->bindValue(':filename', $filename);        $Qcfg->execute();        osC_Cache::clear('configuration');        if ( isset($remove_raw) && ( $remove_raw === true ) ) {          unlink($restore_from);        }        return true;      }      return false;    }    function delete($filename) {      $filename = basename($filename);      if ( !empty($filename) && file_exists(DIR_FS_BACKUP . $filename) ) {        if ( @unlink(DIR_FS_BACKUP . $filename) ) {          return true;        }      }      return false;    }    function forget() {      global $osC_Database;      $Qcfg = $osC_Database->query('delete from :table_configuration where configuration_key = :configuration_key');      $Qcfg->bindTable(':table_configuration', TABLE_CONFIGURATION);      $Qcfg->bindValue(':configuration_key', 'DB_LAST_RESTORE');      $Qcfg->setLogging($_SESSION['module']);      $Qcfg->execute();      if ( !$osC_Database->isError() ) {        osC_Cache::clear('configuration');        return true;      }      return false;    }  }?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?