Вложенные множества, php, как сделать добавление и удаление?

Segey
На сайте с 23.08.2005
Offline
404
1329

Вобщем все вроде бы прекрасно, но гда-то идет сбой :( Вот код на всякий случай...

p.s. никак не могу найти готовый класс. Хотя вроде бы все ОК. По сути дела при добавлении:

1. Обрабатываем родителя в right+2, где создается категория

2. У всей ветки смещение по right делаем +2

3. Создаем новую категорию

4. Обрабатываем все оставшиеся категории у которых left и right больше чем у новой категории т.е. чтобы расширить диапазон всех кто "старше" по числу, что-то я вообще все перестал понимать.

В какой-то момент при выводе начинается путаница и некоторые дети попадают не к своим родителям... При удалении некоторые категории получают - left или right, но все это происходит как-то спонтанно. Т.е. создал большое дерево, пару раз удалял и вдруг при очередном добалении все пошло кувырком...

          // Обработка имени  родительской категории и запрос на параметры

$parent_cat = str_replace("+","",$parent_cat);
$parent_inquery = mysql_query("SELECT cat_left, cat_right, cat_level FROM ".$version."_category WHERE cat_name = '$parent_cat';");
$parent_array = mysql_fetch_row($parent_inquery);

// Вычисляем значения для самой записи новой категории
$new_left = $parent_array[1];
$new_right = $parent_array[1]+1;
$new_level = $parent_array[2]+1;
mysql_query("INSERT INTO ".$version."_category(cat_name, cat_left, cat_right, cat_level) VALUES('$newcat', '$new_left', '$new_right','$new_level')");

// Изменение параметров ветки к которой принадлежит новая категория, кроме родителя
$update_inquery = mysql_query("SELECT cat_name, cat_right FROM ".$version."_category WHERE cat_left < $parent_array[0] AND cat_right > '$parent_array[1]';");
$update_array = mysql_fetch_row($update_inquery);
while ($update_array[0]) {
$right = $update_array[1]+2;
mysql_query("UPDATE ".$version."_category SET cat_right='$right' WHERE cat_name = '$update_array[0]'");
$update_array = mysql_fetch_row($update_inquery);
}

// Увеличиваем значение cat_right родителя на 2
$new_paren_right = $parent_array[1]+2;
mysql_query("UPDATE ".$version."_category SET cat_right='$new_paren_right' WHERE cat_name='$parent_cat'");
$_POST["addcat"]=0;

// Сотавшееся
$update_inquery = mysql_query("SELECT cat_name, cat_left, cat_right FROM ".$version."_category WHERE cat_left > $new_left AND cat_right > '$new_right';");
$update_array = mysql_fetch_row($update_inquery);
while ($update_array[0]) {
$left = $update_array[1]+2;
$right = $update_array[2]+2;
mysql_query("UPDATE ".$version."_category SET cat_right='$right', cat_left = '$left' WHERE cat_name = '$update_array[0]'");
$update_array = mysql_fetch_row($update_inquery);

Но мне кажется что дело в удалении. Вот код, на всякий случай:

     // Запрос на параметры удаляемой категории

$delete_cat = str_replace("+","",$delete_cat);
$delete_catalog = mysql_query("SELECT cat_left, cat_right FROM ".$version."_category WHERE cat_name = '$delete_cat';");
$delete_array = mysql_fetch_row($delete_catalog);

// Удаление всх дочерних категорий, вычисление смещения
$children_inquery = mysql_query("DELETE FROM ".$version."_category WHERE cat_left > '$delete_array[0]' AND cat_right < '$delete_array[1]';");
$number = (mysql_affected_rows())*2+2;

//Удаление самой категории
mysql_query("DELETE FROM ".$version."_category WHERE cat_name = '$delete_cat'");

// Исправление родителей
$parent_inquery = mysql_query("SELECT cat_name, cat_right FROM ".$version."_category WHERE cat_left < '$delete_array[0]' AND cat_right > '$delete_catalog[1]';");
$update_array = mysql_fetch_row($parent_inquery);
while ($update_array[0]) {
$right = $update_array[1]-$number;
mysql_query("UPDATE ".$version."_category SET cat_right = '$right' WHERE cat_name = '$update_array[0]';");
$update_array = mysql_fetch_row($parent_inquery);
}

// Исправление оставшихся категорий
$parent_inquery = mysql_query("SELECT cat_name, cat_left, cat_right FROM ".$version."_category WHERE cat_left > '$delete_array[0]' AND cat_right > '$delete_catalog[1]';");
$update_array = mysql_fetch_row($parent_inquery);
while ($update_array[0]) {
$left = $update_array[1]-$number;
$right = $update_array[2]-$number;
mysql_query("UPDATE ".$version."_category SET cat_left = '$left', cat_right = '$right' WHERE cat_name = '$update_array[0]';");
$update_array = mysql_fetch_row($parent_inquery);
}
Brexit - уже совсем рядом. (https://about-this-model.blogspot.com/2019/03/brexit.html)
mustafa
На сайте с 28.10.2005
Offline
202
#1

честно говоря вообще не понял, что этиа штука должна делать... Но кое-какие глюки заметил:

WHERE cat_left < $parent_array[0] AND cat_right > '$parent_array[1]';"

что такое cat_left и cat_right ?

bondarev.pp.ru
На сайте с 29.09.2005
Offline
202
#2

Segey, посмотрите вот этот вариант. Я его не тестил, использую собственный класс, правда он так и не дописан до конца, потому выкладывать не буду :)

здесь краткое описалово на русском языке.

Вообще алгоритм довольно популярный - наверняка есть много его реализаций. Ищите "Nested Sets" в гугле.

mustafa:
честно говоря вообще не понял, что этиа штука должна делать...

тогда не стоило писать :)

bondarevpipes.com (http://ru.bondarevpipes.com/)
Segey
На сайте с 23.08.2005
Offline
404
#3

bondarev.pp.ru,

Все спасибо, разобрался :)

$delete_array[0]' AND cat_right > '$delete_catalog[1]'

Вот она глупая ошибка :( Вчера долго рисовал деревья, по алгоритму блин све правильно :) Кто же знал, что я так ошибусь и вторая проблема в том, что нужно было по id категории заменять, удалять и т.п. т.к. имена категорий могут совпасть

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий