Рекурсивная функция PHP для удаления всех дочерних узлов вызывает stackoverflow

Моя MySQL выглядит так: (название таблицы – это категория)

'id', 'content', 'parent' 

где:

  • 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'"); } 

Что по какой-то причине не работает и не срабатывает. Любая идея, что я делаю неправильно?

Проблема заключается в рекурсивном вызове:

 remrecurs($curitem['parent']); 

должен быть:

 remrecurs($curitem['id']); 

Зачем?

Ваша цель – удалить строку с заданным идентификатором. Сначала вы проверяете, есть ли у него дети. Если да, вам нужно снова вызвать рекурсивное удаление для каждого из детей, не являющихся родителями. Вы снова вызываете функцию рекурсивно на родителях .. это приводит к бесконечным рекурсивным вызовам, вы разбиваете стек и выходите из строя.

Кроме того, вы можете позволить базе данных справиться с этим. В 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).