opencart getcategories函数进入无限循环

时间:2012-11-29 05:55:19

标签: e-commerce opencart

我有一个包含大约1300个类别的opencart商店,我无法插入新类别或编辑现有类别。我已经安装了分页功能,但它只加速了类别视图。我做了一些调试,发现在管理面板中单击插入或编辑后,下面的函数进入无限循环。任何人都可以帮我解决这个问题

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;
    }

3 个答案:

答案 0 :(得分:1)

第一个解决方案: 你在数据库中也有类别描述吗?如果是这样,MySQL加载的这么多描述可能会给服务器带来负担。尝试优化查询,只选择必需的列,您可以更改查询,如下所示: $query = $this->db->query("SELECT c.category_id, cd.name FROM ...

第二个解决方案 你可以做一个曾经解决我的问题的调试技巧。添加一个echo语句:

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'],

希望这有帮助。

答案 1 :(得分:0)

很难说无限递归是来自DB数据中的实际循环还是某些缓存错误。

实际上,有一种更好的方法来获取树而不是如此繁重的递归查询,根据我的经验,这会破坏数据库性能。

尝试清除缓存(手动删除文件,无论如何,您的网站目前无法正常工作......),如果循环仍然存在,则除了检查类别表数据之外没有其他机会。

我会尝试制作一个PHP ad hoc来做到这一点......

答案 2 :(得分: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']));

目前这对我有用,但我不知道这是否正确。感谢大家的快速帮助。