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

Dre*_*ave 8 php mysql stack-overflow recursion function

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

'id', 'content', 'parent'
Run Code Online (Sandbox Code Playgroud)

哪里:

  • id =类别的ID
  • content = some-text-we-dont-care-about
  • 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'");
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它不起作用和崩溃..任何想法我做错了什么?

cod*_*ict 11

问题出在递归调用中:

remrecurs($curitem['parent']);
Run Code Online (Sandbox Code Playgroud)

它应该是:

remrecurs($curitem['id']);
Run Code Online (Sandbox Code Playgroud)

为什么?

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


Wri*_*ken 5

或者,您可以让数据库处理此问题.在MySQL中,InnoDBON 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
Run Code Online (Sandbox Code Playgroud)

根节点应该具有NULL父节点(而不是0某些人似乎在Adjancency List表上使用).