我的MySQL看起来像这样:(表的名称是类别)
'id', 'content', 'parent'
其中:
这就是我现在正在尝试的事情:
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'");
}
由于某种原因,它不起作用和崩溃.. 知道我做错了吗?
答案 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表中使用了这些节点。)