【问题标题】:PHP recursive function to delete all child nodes causes stackoverflowPHP递归函数删除所有子节点导致stackoverflow
【发布时间】:2010-10-23 12:22:24
【问题描述】:

我的 MySQL 是这样的:(表名是 category)

'id', 'content', 'parent'

地点:

  • id = 类别的id
  • 内容= 一些我们不关心的文本
  • 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'");
}

由于某种原因不起作用并崩溃.. 知道我做错了什么吗?

【问题讨论】:

    标签: php mysql function recursion stack-overflow


    【解决方案1】:

    问题出在递归调用中:

    remrecurs($curitem['parent']);
    

    应该是:

    remrecurs($curitem['id']);
    

    为什么?

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

    【讨论】:

    • 谢谢!现在效果很好 - 我讨厌这样的事情让我慢下来 - 我想在某些事情上需要另一种观点:)
    【解决方案2】:

    或者,您可以让数据库处理此问题。在 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,因为有些人似乎在邻接列表表中使用)。

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多