我有一个包含大约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;
}
答案 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']));
目前这对我有用,但我不知道这是否正确。感谢大家的快速帮助。