2011-08-24 128 views
2

我已將我的opencart站點版本1.4.9.2升級到版本1.5.X, 我升級數據庫但不知道如何升級文件。 如果有任何關於此的腳本,請發送給我。 我使用腳本來更新表: -opencart站點從版本1.4.x升級到1.5.x

<?php 

# Upgrade Script Beta v2 

// Run full install if config doesn't exist 
if (!file_exists('../config.php')) { 
    header('Location: ./index.php'); 
    exit; 
} 

set_error_handler("myErrorHandler"); 

// Configuration 
require_once('../config.php'); 

// Startup 
require_once(DIR_SYSTEM . 'startup.php'); 

// Get Path & Url 
$errors = array(); 
$baseurl=(isset($_SERVER['HTTPS']) ? 'https' :'http'). '://' . $_SERVER['HTTP_HOST'] . str_replace('/install','',dirname($_SERVER['REQUEST_URI'])); 
chdir('..'); 
$basepath=getcwd(); 
chdir(dirname(__FILE__)); 

if (!$link = @mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD)) { 
    $errors[] = 'Could not connect to the database server using the username and password provided.'; 
} else { 
    if ([email protected]_select_db(DB_DATABASE, $link)) { 
     $errors[] = 'The database could selected, check you have permissions, and check it exists on the server.'; 
    } 
} 

?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Installation</title> 
    <link rel="stylesheet" type="text/css" href="style.css"> 
    </head> 

    <body> 
     <h1>OpenCart 1.x Upgrade Script (BETA)</h1> 
     <div id="container"> 
<?php 

    function myErrorHandler($errno, $errstr, $errfile, $errline) { 
     echo "LINE $errline: [$errno] $errstr<br/>"; 
     return; 
    } 

    if (empty($errors)) { 
     // Run upgrade script 
     $file='upgrade-14x-to-15x.no-opt.sql'; 
     if (!file_exists($file)) { 
      $errors[] = 'Upgrade SQL file '.$file.' could not be found.'; 
     } else { 
      mysql_query('set character set utf8', $link); 
      if ($sql=file($file)) { 
       $query = ''; 
       foreach($sql as $line) { 

        // Hacks for compatibility (needs to be improved) 
        $line = str_replace("oc_", DB_PREFIX, $line); 
        $line = str_replace(" order ", " `order` ", $line); 
        $line = str_replace(" ssl ", " `ssl` ", $line); 
        $line = str_replace("NOT NULL DEFAULT ''", "NOT NULL", $line); 
        $line = str_replace("NOT NULL DEFAULT NULL", "NOT NULL", $line); 
        $line = str_replace("NOT NULL DEFAULT 0 COMMENT '' auto_increment", "NOT NULL COMMENT '' auto_increment", $line); 
        $line = trim($line); 
        //$line = str_replace(";", "", $line); 

        if ((substr(trim($line), 0, 2) == '--') || (substr(trim($line), 0, 1) == '#')) { continue; } 
        if (preg_match('/^ALTER TABLE (.+?) ADD PRIMARY KEY/', $line, $matches)) { 
         $res = mysql_query(sprintf("SHOW KEYS FROM %s",$matches[1]), $link); 
         $info = mysql_fetch_assoc(mysql_query(sprintf("SHOW KEYS FROM %s",$matches[1]), $link)); 
         if ($info['Key_name'] == 'PRIMARY') { continue; } 
        } 
        if (preg_match('/^ALTER TABLE (.+?) ADD (.+?) /', $line, $matches)) { 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $matches[2])), $link)) > 0) { continue; } 
        } 
        if (preg_match('/^ALTER TABLE (.+?) DROP (.+?) /', $line, $matches)) { 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $matches[2])), $link)) <= 0) { continue; } 
        } 
        if (preg_match('/INNER JOIN (.+?) /', $line, $matches)) { 
         $xx = @mysql_query(sprintf("SHOW TABLES LIKE '%s'", str_replace('`', '', $matches[1])), $link); 
         if ($xx && mysql_num_rows($xx) <= 0) { continue; } 
        } 
        if (preg_match('/^DROP TABLE (.+?);/', $line, $matches)) { 
         if (preg_match('/^DROP TABLE IF EXISTS (.+?);/', $line, $matches2)) { 
          //if (mysql_num_rows(@mysql_query(sprintf("DESC %s", str_replace('`', '', $matches2[1])), $link)) <= 0) { continue; } 
         } else { 
          if (mysql_num_rows(@mysql_query(sprintf("SHOW TABLES LIKE '%s'", str_replace('`', '', $matches[1])), $link)) <= 0) { continue; } 
         } 
        } 
        if (strpos($line, 'ALTER TABLE') !== FALSE && strpos($line, 'DROP') !== FALSE && strpos($line, 'PRIMARY') === FALSE) { 
         $params = explode(' ', $line); 
         if ($params[3] == 'DROP') { 
          if (mysql_num_rows(@mysql_query("SHOW COLUMNS FROM $params[2] LIKE '$params[4]'", $link)) <= 0) { continue; } 
         } 
        } 
        if (preg_match('/^ALTER TABLE ([^\s]+) DEFAULT (.+?) /', $line, $matches)) { 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW TABLES LIKE '%s'", str_replace('`', '', $matches[1])), $link)) <= 0) { continue; } 
        } 
        if (preg_match('/^ALTER TABLE (.+?) MODIFY (.+?) /', $line, $matches)) { 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $matches[2])), $link)) <= 0) { continue; } 
        } 
        if (preg_match('/^ALTER TABLE (.+?) CHANGE (.+?) (.+?) /', $line, $matches)) { 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $matches[2])), $link)) <= 0) { 
          continue; 
         } 

         // if it does exist, be sure the new name doesn't also exist. If so, then just delete it. 
         if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $matches[3])), $link)) > 0) { 
          @mysql_query(sprintf("ALTER TABLE %s DROP %s", $matches[1], str_replace('`', '', $matches[2])), $link); //Drop the column if it was supposed to be changed to a column that already exists 
          continue; 
         } 
        } 
        if (preg_match('/^DELETE FROM (.+?) WHERE (.+?) /', $line, $matches)) { 
         if (preg_match('~ WHERE (.*);$~', $line, $matches2)) { 
          if (preg_match_all('~`([^`]+)`~', $matches2[1], $matched)) { 
           $notfound = 0; 
           foreach ($matched[1] as $m) { 
            if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1],str_replace('`', '', $m)), $link)) <= 0) { 
             $notfound++; 
            } 
           } 
           if ($notfound) { continue; } 
          } 
         } 
        } 
        if (preg_match('/^INSERT INTO (.+?) \(([^)]+)\) /', $line, $matches)) { 
         $parts = explode(",", str_replace("`", "", $matches[2])); 
         $notfound = 0; 
         foreach ($parts as $m) { 
          if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[1], trim($m)), $link)) <= 0) { 
           $notfound++; 
          } 
         } 
         if ($notfound) { continue; } 
        } 
        if (preg_match('/^INSERT INTO (.+?) \(([^)]+)\) SELECT ([^FROM]+) FROM `([^`]+)`/', $line, $matches)) { 
         $parts = explode(",", str_replace("`", "", $matches[3])); 
         $notfound = 0; 
         foreach ($parts as $m) { 
          if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'", $matches[4], trim($m)), $link)) <= 0) { 
           $notfound++; 
          } 
         } 
         if ($notfound) { continue; } 
        } 
        //if (preg_match('/^ALTER TABLE (.+?) DEFAULT (.+?) /',$line,$matches)) { 
        // if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'",$matches[1],str_replace('`','',$matches[2])), $link)) <= 0) { continue; } 
        //} 
        //if (preg_match('/^ALTER TABLE (.+?) ALTER (.+?) /',$line,$matches)) { 
        // if (mysql_num_rows(@mysql_query(sprintf("SHOW COLUMNS FROM %s LIKE '%s'",$matches[1],str_replace('`','',$matches[2])), $link)) <= 0) { continue; } 
        //} 

        if (!empty($line)) { 
         $query .= $line; 
         if (preg_match('/;\s*$/', $line)) { 
          if (mysql_query($query, $link) === false) { 
           $errors[] = 'Could not execute this query: ' . $query . ' ' . mysql_error($link); 
          } 
          $query = ''; 
         } 
        } 
       } 
      } 
     } 
    } 

    // Check if there are any products associated with a store (pre-1.4.1) 
    $info = mysql_fetch_assoc(mysql_query("SELECT * FROM " . DB_PREFIX . "product_to_store", $link)); 

    // If not, then add them all to the default 
    if (!$info) { 
     $resource = mysql_query("SELECT product_id FROM " . DB_PREFIX . "product", $link); 
     $data = array(); 
     $i = 0; 
     while ($result = mysql_fetch_assoc($resource)) { 
      $data[$i] = $result; 

      $i++; 
     } 

     foreach ($data as $product) { 
      mysql_query("INSERT INTO " . DB_PREFIX . "product_to_store SET product_id = '".$product['product_id']."', store_id = '0'", $link); 
     } 
    } 

    // Check if there are any informations associated with a store (pre-1.4.1) 
    $info = mysql_fetch_assoc(mysql_query("SELECT * FROM " . DB_PREFIX . "information_to_store", $link)); 

    // If not, then add them all to the default 
    if (!$info) { 
     $resource = mysql_query("SELECT information_id FROM " . DB_PREFIX . "information", $link); 
     $data = array(); 
     $i = 0; 
     while ($result = mysql_fetch_assoc($resource)) { 
      $data[$i] = $result; 

      $i++; 
     } 

     foreach ($data as $information) { 
      mysql_query("INSERT INTO " . DB_PREFIX . "information_to_store SET information_id = '".$information['information_id']."', store_id = '0'", $link); 
     } 
    } 

    // Check if there are any categories associated with a store (pre-1.4.1) 
    $info = mysql_fetch_assoc(mysql_query("SELECT * FROM " . DB_PREFIX . "category_to_store", $link)); 

    // If not, then add them all to the default 
    if (!$info) { 
     $resource = mysql_query("SELECT category_id FROM " . DB_PREFIX . "category", $link); 
     $data = array(); 
     $i = 0; 
     while ($result = mysql_fetch_assoc($resource)) { 
      $data[$i] = $result; 

      $i++; 
     } 

     foreach ($data as $category) { 
      mysql_query("INSERT INTO " . DB_PREFIX . "category_to_store SET category_id = '".$category['category_id']."', store_id = '0'", $link); 
     } 
    } 

    // Check if there are any manufacturers associated with a store (pre-1.4.1) 
    $info = mysql_fetch_assoc(mysql_query("SELECT * FROM " . DB_PREFIX . "manufacturer_to_store", $link)); 

    // If not, then add them all to the default 
    if (!$info) { 
     $resource = mysql_query("SELECT manufacturer_id FROM " . DB_PREFIX . "manufacturer", $link); 
     $data = array(); 
     $i = 0; 
     while ($result = mysql_fetch_assoc($resource)) { 
      $data[$i] = $result; 

      $i++; 
     } 

     foreach ($data as $manufacturer) { 
      mysql_query("INSERT INTO " . DB_PREFIX . "manufacturer_to_store SET manufacturer_id = '".$manufacturer['manufacturer_id']."', store_id = '0'", $link); 
     } 
    } 

    ###################################### 
    # START 1.5.x UPGRADE CODE 
    ###################################### 


    /** 
    * Convert Store table to Setting table 
    */ 
    $sql = "SELECT * FROM " . DB_PREFIX . "store"; 
    $resource = mysql_query($sql, $link); 

    if ($resource) { 
     if (is_resource($resource)) { 
      $i = 0; 

      $data = array(); 

      while ($result = mysql_fetch_assoc($resource)) { 
       $data[$i] = $result; 

       $i++; 
      } 

      mysql_free_result($resource); 

     } 
    } 

    // Only run if coming from 1.4.x to 1.5.x. Skip if coming from another 1.5.x version 
    if ($data && isset($data[0]['zone_id'])) { 
     $storedata = array(); 
     foreach ($data as $d) { 
      $storedata[$d['store_id']] = $d; 
      unset($storedata[$d['store_id']]['store_id']); 
     } 

     foreach ($storedata as $store_id => $value) { 

      // Verify the store id doesn't already exist 
      $qry = mysql_fetch_assoc(mysql_query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '" . (int)$store_id . "'", $link)); 
      if ($qry) { continue; } 

      // New store fields 
      if (!isset($value['address'])) { $value['address'] = '' ;} 
      if (!isset($value['email'])) { $value['email'] = '' ;} 
      if (!isset($value['telephone'])) { $value['telephone'] = '' ;} 
      if (!isset($value['fax'])) { $value['fax'] = '' ;} 
      if (!isset($value['layout'])) { $value['layout'] = '' ;} 
      if (!isset($value['image_compare_height'])) { $value['image_compare_height'] = '' ;} 
      if (!isset($value['image_compare_width'])) { $value['image_compare_width'] = '' ;} 
      if (!isset($value['image_manufacturer_height'])) { $value['image_manufacturer_height'] = '' ;} 
      if (!isset($value['image_manufacturer_width'])) { $value['image_manufacturer_width'] = '' ;} 
      if (!isset($value['image_wishlist_height'])) { $value['image_wishlist_height'] = '' ;} 
      if (!isset($value['image_wishlist_width'])) { $value['image_wishlist_width'] = '' ;} 

      // special case 
      if (!isset($value['use_ssl'])) { $value['use_ssl'] = $value['ssl'] ;} 
      if (!isset($value['ssl'])) { 
       if ($value['use_ssl']) { 
        $value['ssl'] = str_replace('http://', 'https://', $value['url']); 
       } else { 
        $value['ssl'] = $value['url']; 
       } 
       mysql_query("INSERT INTO " . DB_PREFIX . "store SET `ssl` = '" . $value['ssl'] . "' WHERE store_id = '" . (int)$store_id . "', `group` = 'config'", $link); 
      } 


      foreach ($value as $k => $v) { 
       mysql_query("INSERT INTO " . DB_PREFIX . "setting SET `key` = 'config_" . $k . "', `value` = '" . $v . "', store_id = '" . (int)$store_id . "', `group` = 'config'", $link); 
      } 
     } 

     $sql = "ALTER TABLE `" . DB_PREFIX . "store` 
        DROP `title`, 
        DROP `meta_description`, 
        DROP `template`, 
        DROP `country_id`, 
        DROP `zone_id`, 
        DROP `language`, 
        DROP `currency`, 
        DROP `tax`, 
        DROP `customer_group_id`, 
        DROP `customer_price`, 
        DROP `customer_approval`, 
        DROP `guest_checkout`, 
        DROP `account_id`, 
        DROP `checkout_id`, 
        DROP `stock_display`, 
        DROP `stock_check`, 
        DROP `stock_checkout`, 
        DROP `order_status_id`, 
        DROP `logo`, 
        DROP `icon`, 
        DROP `image_thumb_width`, 
        DROP `image_thumb_height`, 
        DROP `image_popup_width`, 
        DROP `image_popup_height`, 
        DROP `image_category_width`, 
        DROP `image_category_height`, 
        DROP `image_product_width`, 
        DROP `image_product_height`, 
        DROP `image_additional_width`, 
        DROP `image_additional_height`, 
        DROP `image_related_width`, 
        DROP `image_related_height`, 
        DROP `image_cart_width`, 
        DROP `image_cart_height`, 
        DROP `catalog_limit`, 
        DROP `cart_weight`, 
        AUTO_INCREMENT=1;"; 

     mysql_query($sql, $link); 

    } 



    /** 
    * Convert Options to Global Options 
    */ 

/* 
    # Convert options over.. big job 
ALTER TABLE `oc_order_option` 
    ADD `product_option_id` int(11) NOT NULL DEFAULT 0 COMMENT '' AFTER order_product_id, 
    ADD `type` varchar(32) NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin AFTER value, 
    MODIFY `value` text NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin, 
    DROP `price`, 
    DROP `prefix`; 

ALTER TABLE `oc_product_option` 
    ADD `option_id` int(11) NOT NULL DEFAULT 0 COMMENT '' AFTER product_id, 
    ADD `option_value` text NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin AFTER option_id, 
    ADD `required` int(1) NOT NULL DEFAULT 0 COMMENT '' AFTER option_value, 
    DROP `sort_order`; 


DROP TABLE `oc_product_option_description`; 

ALTER TABLE `oc_product_option_value` 
    ADD `option_id` int(11) NOT NULL DEFAULT 0 COMMENT '' AFTER product_id, 
    ADD `option_value_id` int(11) NOT NULL DEFAULT 0 COMMENT '' AFTER option_id, 
    ADD `price_prefix` varchar(1) NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin AFTER price, 
    ADD `points` int(8) NOT NULL DEFAULT 0 COMMENT '' AFTER price_prefix, 
    ADD `points_prefix` varchar(1) NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin AFTER points, 
    ADD `weight` decimal(15,8) NOT NULL DEFAULT '' COMMENT '' AFTER points_prefix, 
    ADD `weight_prefix` varchar(1) NOT NULL DEFAULT '' COMMENT '' COLLATE utf8_bin AFTER weight, 
    MODIFY `quantity` int(3) NOT NULL DEFAULT 0 COMMENT '', 
    ALTER `subtract` DROP DEFAULT, 
    DROP `prefix`, 
    DROP `sort_order`; 


DROP TABLE `oc_product_option_value_description`; 



write this back to the config.php 
// HTTP 
define('HTTP_SERVER', 'http://localhost/v150/'); 
define('HTTP_IMAGE', 'http://localhost/v150/image/'); 
define('HTTP_ADMIN', 'http://localhost/v150/admin/'); 

// HTTPS 
define('HTTPS_SERVER', 'http://localhost/v150/'); 
define('HTTPS_IMAGE', 'http://localhost/v150/image/'); 


*/ 


    if (!empty($errors)) { //has to be a separate if 
     ?> 
     <p>The following errors occured:</p> 
     <?php foreach ($errors as $error) {?> 
     <div class="warning"><?php echo $error;?></div><br /> 
     <?php } ?> 
     <p>The above errors occurred because the script could not properly determine the existing state of those db elements. Your store may not need those changes. Please post any errors on the forums to ensure that they can be addressed in future versions!</p> 
     </div> 
<?php } else { ?> 
     <h2>SUCCESS!!! Click <a href="<?php echo $baseurl; ?>">here</a> to goto your store</h2> 
<?php } ?> 
     <div class="center"><a href="http://www.opencart.com/">OpenCart.com</a></div> 
    </body> 
</html> 

回答

1

我不知道一個腳本,能夠更新Opencart的文件。你只需要清空你的FTP並上傳1.5.x包。如果您使用任何(自定義)模塊,則需要重新安裝它們。但要小心,因爲爲1.4.x開發的模塊不能自動與1.5.x兼容。

+0

大多數爲1.4.x開發的模塊都不能與1.5.x一起使用,因爲它們徹底重新設計瞭解決方案......大多數作者的擴展部分都有其升級版本的腳本(如果作者仍在積極開發).. – CarpeNoctumDC