PHP递归函数删除所有子节点导致堆栈溢出
我的MySQL如下所示:(表名为category) 其中: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
- 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