PHP рекурсивная функция для удаления всех дочерних узлов вызывает переполнение стека - PullRequest
8 голосов
/ 21 октября 2010

MySQL выглядит следующим образом: (имя таблицы - категория)

'id', 'content', 'parent'

где:

  • id = идентификатор категории
  • содержание = некоторые-текст-мы-Dont-уход-о
  • 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'");
}

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

Ответы [ 2 ]

11 голосов
/ 21 октября 2010

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

remrecurs($curitem['parent']);

должно быть:

remrecurs($curitem['id']);

Почему?

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

5 голосов
/ 21 октября 2010

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

...