PHP递归函数删除所有子节点导致堆栈溢出

PHP递归函数删除所有子节点导致堆栈溢出,php,mysql,function,recursion,stack-overflow,Php,Mysql,Function,Recursion,Stack Overflow,我的MySQL如下所示:(表名为category) 其中: id=类别的id 内容= 一些我们不关心的文本 父项=父项的id 类别 这就是我现在正在尝试的: function remrecurs($id) { $qlist=mysql_query("SELECT * FROM category WHERE parent='$id'"); if (mysql_num_rows($qlist)>0) { while($curitem=mysql_fetch

我的MySQL如下所示:(表名为category)

其中:

  • id=类别的id
  • 内容= 一些我们不关心的文本
  • 父项=父项的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'");
}
由于某种原因,它不起作用并且崩溃了。。
知道我做错了什么吗?

问题在于递归调用:

remrecurs($curitem['parent']);
应该是:

remrecurs($curitem['id']);
为什么?


您的目标是删除具有给定id的行。首先检查该行是否有子行。如果是,则需要对每个子项调用递归删除,而不是再次对父项调用递归删除。您再次在父级上递归调用函数。这将导致无限次递归调用,您将重击堆栈并崩溃。

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

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

谢谢!现在效果很好-我讨厌这样的事情让我慢下来-我想有些事情需要另一种观点:)
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