Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разработка функции удаления бесконечно-вложенного каталога
 
 автор: Demogorgon   (14.08.2005 в 03:04)   письмо автору
 
 

Здравствуйте.
У меня есть таблица 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.

   
 
 автор: Ozxar   (14.08.2005 в 04:43)   письмо автору
 
   для: Demogorgon   (14.08.2005 в 03:04)
 

Ну смотри для начало алгоритм действия... посылаете скрипту переменную ид он удаляет главную подкатегорию после упешного выполнения идет цикл которые перебирает парент с значением ид и выполняет удаление этих субкатегорий и выполняет цикл с удалением субсубкатегорий со значением парентов с переменной ид субкатегории

но поймойму это не очень красиво =(( но больше ничего не придумал

   
 
 автор: Ozxar   (14.08.2005 в 04:54)   письмо автору
 
   для: 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"))
{


}
}
         }      }

?>

   
 
 автор: Lenux   (14.08.2005 в 06:54)   письмо автору
 
   для: Ozxar   (14.08.2005 в 04:54)
 

А зачем ты сначала удаляешь, а затем вытаскиваешь?

   
 
 автор: Demogorgon   (14.08.2005 в 18:42)   письмо автору
 
   для: Ozxar   (14.08.2005 в 04:54)
 

а теперь сам код
Я его не проверял... если что поправьте


Спасибо, но что-то не подходит.
Действительно, вначале следует выбрать, а потом удалить... Но что удалять... и как... вот в этом-то и вопрос...

   
 
 автор: cheops   (14.08.2005 в 13:26)   письмо автору
 
   для: Demogorgon   (14.08.2005 в 03:04)
 

Конструкция бесконечно вложенная?

PS Вопросы посвящённые базам данных, лучше сразу помещать в разделе http://www.softtime.ru/forum/index.php?id_forum=3

   
 
 автор: Demogorgon   (14.08.2005 в 18:40)   письмо автору
 
   для: cheops   (14.08.2005 в 13:26)
 

Конструкция бесконечно вложенная?
Да. происходит бесконечный цикл.
Как я понял, надо выбрать все записи parent = id, возвратить новые значиения id и снова выбрать parent = new id. Потом удалить все значения parent... Как-то так..
Рекурсия, в общем, только вот какая?

PS Вопросы посвящённые базам данных, лучше сразу помещать в разделе http://www.softtime.ru/forum/index.php?id_forum=3
Понял.

   
 
 автор: cheops   (14.08.2005 в 23:45)   письмо автору
 
   для: 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());
  }
?>

   
 
 автор: Demogorgon   (15.08.2005 в 02:35)   письмо автору
 
   для: cheops   (14.08.2005 в 23:45)
 

Спасибо!
Буду продолжать дальше...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования