2012-11-29 75 views
0

我有一個opencart商店,大約有1300個類別,我無法插入新類別或編輯現有類別。我已經安裝了分頁功能,但它只加快了分類視圖。我做了一些調試,發現一旦我點擊插入或編輯管理面板內,下面的函數進入無限循環。誰能幫我如何解決這一問題opencart getcategories函數進入無限循環

public function getCategories($parent_id = 0) { 
     $category_data = $this->cache->get('category.' . (int)$this->config->get('config_language_id') . '.' . (int)$parent_id); 

     if (!$category_data) { 
      $category_data = array(); 

      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY c.sort_order, cd.name ASC"); 

      foreach ($query->rows as $result) { 
       $category_data[] = array(
        'category_id' => $result['category_id'], 
        'name'  => $this->getPath($result['category_id'], $this->config->get('config_language_id')), 
        'status'  => $result['status'], 
        'sort_order' => $result['sort_order'] 
       ); 

       $category_data = array_merge($category_data, $this->getCategories($result['category_id'])); 
      } 

      $this->cache->set('category.' . (int)$this->config->get('config_language_id') . '.' . (int)$parent_id, $category_data); 
     } 

     return $category_data; 
    } 
+0

在上面的哪一點開始循環?你能堅持一些回聲陳述,看看你有多遠? – Stuart

+0

回聲沒有工作,因爲這dosen't克服...在array_merge,我成爲遞歸,它進入子類別...所以在我的服務器,它顯示500內部錯誤,並在我的本地服務器,它顯示超時..我也沒有達到緩存設置功能... – hablema

+0

那麼你是說遞歸出現在'$ category_data = array_merge($ category_data,$ this-> getCategories($ result ['category_id']));'這是否正確?如果是這樣的話,在它回顯或var_dump之前,輸出$ category_data和$ result ['category_id']的值 – Stuart

回答

0

很難說,如果無限遞歸從DB數據實際循環或緩存misalignement來了。

有效地,有一種更好的方式來獲得樹,而不是如此沉重的遞歸查詢,以我的經驗殺死數據庫性能。

嘗試清除緩存(手動刪除文件,無論如何您的網站目前無法正常工作......),如果循環持續存在,除檢查類別表數據外沒有其他機會。

我會嘗試製作一個PHP特設做到這一點...

0

我有我的工作電流而不是永久性的解決方案...我不知道它是否做了正確的方式,但它適用於我。我改變了查詢本

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c ORDER BY c.parent_id,c.sort_order"); 

,並評論關閉

//$category_data = array_merge($category_data, $this->getCategories($result['category_id'])); 

目前這對我的作品,但我不知道它是否是正確的方法還是不行。感謝大家的快速幫助。

1

第一個解決方案: 您是否還有數據庫中的分類描述?如果是這樣,那麼由MySQL加載的這麼多描述可能會使服務器負擔過重。嘗試優化查詢,只選擇需要的列,您可以更改查詢作爲下: $query = $this->db->query("SELECT c.category_id, cd.name FROM ...

第二種解決 你可以做曾經解決我的問題多了一個調試技巧。添加回聲聲明:

echo $result['name']; 
$category_data = array_merge($category_data, $this->getCategories($result['category_id']));` ` 

這樣您就可以知道處理被絞死的類別的確切位置。該特定類別可能存在某些問題。

方案三 嘗試改變

'name' => $this->getPath($result['category_id'], $this->config->get('config_language_id')),

要:

'name' => $result['name'],

希望這有助於。