PHP递归函数删除所有子节点导致stackoverflow

时间:2010-10-21 09:16:32

标签: php mysql function recursion stack-overflow

我的MySQL看起来像这样:(表的名称是类别)

'id', 'content', 'parent'

其中:

  • id =类别的ID
  • content = 一些文本 - 我们 - 不要 - 护理 - 约
  • parent =父级的ID 类

这就是我现在正在尝试的事情:

function remrecurs($id) {
    $qlist=mysql_query("SELECT * FROM category WHERE parent='$id'");
    if (mysql_num_rows($qlist)>0) {
         while($curitem=mysql_fetch_array($qlist)) {
              remrecurs($curitem['parent']);
         }
    }
    mysql_query("DELETE FROM category WHERE id='$id'");
}

由于某种原因,它不起作用和崩溃.. 知道我做错了吗?

2 个答案:

答案 0 :(得分:11)

问题在于递归调用:

remrecurs($curitem['parent']);

它应该是:

remrecurs($curitem['id']);

<强>为什么吗

您的目标是删除具有给定ID的行。首先你检查它是否有孩子。如果是,则需要再次在父项 子项 上调用递归删除。您再次在父级上递归调用该函数。这会导致无限递归调用,您会崩溃堆栈并崩溃。

答案 1 :(得分:5)

或者,您可以让数据库处理此问题。在MySQL中,InnoDB ON DELETE CASCADE会自动执行此操作。

CREATE TABLE category (
    id INT PRIMARY KEY AUTO_INCREMENT,
    parent_id INT NULL,
    FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE CASCADE
) ENGINE=InnoDB

根节点应该有NULL作为父节点(不是0,因为有些人似乎在Adjancency List表中使用了这些节点。)