Моя 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'"); }
Что по какой-то причине не работает и не срабатывает. Любая идея, что я делаю неправильно?
Проблема заключается в рекурсивном вызове:
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).