|
|
|
| Здравствуйте.
У меня есть таблица Category в бд такого вида:
id - идентификационный номер категории;
name - название.
parent - в этот столбец заносится id родительской категории. Если категория - главная, то заносится ноль, если - субкатегория, то id родителя.
Все работает... но возникла проблема написания функции удаления главной категории (т.е. parent - 0) со всеми подкатегориями, в т.ч. и теми подкатегориями, предки которых были субкатегориями для главной. Т.е. если я создаю первую категорию: id=1, name=PHP, parent =0. В этой категории я создаю субкатегорию: id=2, name=Arrays, parent=1. Дальше я в категории Arrays создаю еще две категории, и, в только что созданных категориях, еще штук десять...
Помогите, пожалуйста, разобраться с функцией для удаления конкретной главной категории(parent=0) со всеми ее субкатегориями и субкатегориями, которые были созданы для субкатегорий главной категории.
Параметры, которые передаются на страницу удаления - это id и parent. | |
|
|
|
|
|
|
|
для: Demogorgon
(14.08.2005 в 03:04)
| | Ну смотри для начало алгоритм действия... посылаете скрипту переменную ид он удаляет главную подкатегорию после упешного выполнения идет цикл которые перебирает парент с значением ид и выполняет удаление этих субкатегорий и выполняет цикл с удалением субсубкатегорий со значением парентов с переменной ид субкатегории
но поймойму это не очень красиво =(( но больше ничего не придумал | |
|
|
|
|
|
|
|
для: Ozxar
(14.08.2005 в 04:43)
| | а теперь сам код
Я его не проверял... если что поправьте
<?
if(MYSQL_QUERY("DELETE FROM 'Category' WHERE id='".$id."' LIMIT 1")) {
$r = mysql_query("SELECT * FROM Category Where parent = '".$id."'");
for($i=0; $i<mysql_num_rows($r); $i++)
{ $item=mysql_fetch_array($r);
if(MYSQL_QUERY("DELETE FROM 'Category' WHERE id='".$item['id']."' LIMIT 1"))
{
$g = mysql_query("SELECT * FROM Category Where parent = '".$item['id']."'");
for($i=0; $i<mysql_num_rows($g); $i++)
{ $items=mysql_fetch_array($g);
if(MYSQL_QUERY("DELETE FROM 'Category' WHERE id='".$items['id']."' LIMIT 1"))
{
}
}
} }
?>
|
| |
|
|
|
|
|
|
|
для: Ozxar
(14.08.2005 в 04:54)
| | А зачем ты сначала удаляешь, а затем вытаскиваешь? | |
|
|
|
|
|
|
|
для: Ozxar
(14.08.2005 в 04:54)
| | а теперь сам код
Я его не проверял... если что поправьте
Спасибо, но что-то не подходит.
Действительно, вначале следует выбрать, а потом удалить... Но что удалять... и как... вот в этом-то и вопрос... | |
|
|
|
|
|
|
|
для: Demogorgon
(14.08.2005 в 03:04)
| | Конструкция бесконечно вложенная?
PS Вопросы посвящённые базам данных, лучше сразу помещать в разделе http://www.softtime.ru/forum/index.php?id_forum=3 | |
|
|
|
|
|
|
|
для: cheops
(14.08.2005 в 13:26)
| | Конструкция бесконечно вложенная?
Да. происходит бесконечный цикл.
Как я понял, надо выбрать все записи parent = id, возвратить новые значиения id и снова выбрать parent = new id. Потом удалить все значения parent... Как-то так..
Рекурсия, в общем, только вот какая?
PS Вопросы посвящённые базам данных, лучше сразу помещать в разделе http://www.softtime.ru/forum/index.php?id_forum=3
Понял. | |
|
|
|
|
|
|
|
для: Demogorgon
(14.08.2005 в 18:40)
| | Да здесь следует писать рекурсивную функцию, так как каскадные ключи поддерживаются только в типе таблиц InnoDB и то помоему с версии 4.1, а этот тип таблиц достаточно медленный.
Поэтому следует использовать примерно следующую рекурсивную функцию
<?php
function del_ord($id)
{
// Извлекаем потомков записи $id
$query = "SELECT * FROM tbl WHERE parent = $id";
$tbl = mysql_query($query);
if(!$tbl) exit(mysql_error());
// Если есть хоть одна запись создаём цикл
if(mysql_num_rows($tbl)>0)
{
while($arr = mysql_fetch_array($tbl))
{
// Рекурсивно вызываем функцию del_ord()
del_ord($arr['id']);
}
}
// Удаляем текущую запись, после того, как удалены потомки
$query = "DELETE FROM tbl WHERE id = $id";
if(!mysql_query($query) exit(mysql_error());
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.08.2005 в 23:45)
| | Спасибо!
Буду продолжать дальше... | |
|
|
|