[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: редактируем древовидное меню!
Igor
Всем Хай! Создал меню:

id | pid | name

1 | 0 | root
2 | 1 | Раздел 1
3 | 1 | Раздел 2
4 | 1 | Раздел 3
5 | 2 | Подраздел 1.1
6 | 2 | Подраздел 1.2
7 | 2 | Подраздел 1.3
8 | 3 | Подраздел 2.1
9 | 3 | Подраздел 2.2
10 | 3 | Подраздел 2.3
11 | 9 | Подраздел 2.2.1
12 | 9 | Подраздел 2.2.2

Но как правильно создать запрос для удаления например раздела "1" соответственно с подразделами или удалить Подраздел 2.2 с подразделами? bc.gif Туплю...



Спустя 28 минут, 10 секунд (30.08.2007 - 10:35) Ghost написал(а):
в один запрос никак. вот за что я люблю postgres и внешние ключи с каскадным обновлением smile.gif

Спустя 10 минут, 42 секунды (30.08.2007 - 10:45) Igor написал(а):
Цитата(Ghost @ 30.8.2007, 7:35) [snapback]26554[/snapback]
в один запрос никак. вот за что я люблю postgres и внешние ключи с каскадным обновлением smile.gif


Ну мож в два-три запроса, а то у меня на эту операцию в голову приходит 2МВ текста! dumau.gif

Спустя 7 минут, 56 секунд (30.08.2007 - 10:53) vasa_c написал(а):
function удалить_раздел(номер)
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}

Спустя 5 часов, 2 минуты, 42 секунды (30.08.2007 - 15:56) Igor написал(а):
Цитата(vasa_c @ 30.8.2007, 7:53) [snapback]26556[/snapback]
function удалить_раздел(номер)
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}



A что значит "рекурсивно"? blink.gif

Спустя 42 минуты, 5 секунд (30.08.2007 - 16:38) md5 написал(а):

Спустя 15 часов, 45 минут, 25 секунд (31.08.2007 - 08:24) Igor написал(а):
Цитата(md5 @ 30.8.2007, 13:38) [snapback]26588[/snapback]



Cпасибо за ссылку!
но как это замутить? Вот что написал:

Код
//выбрать отмеченые разделы
$delmenu0 = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `del` = '1' ORDER BY `ud`";
$result0 = mysql_query($delmenu0);
while ( $row0 = mysql_fetch_array($result0) )
{
echo"выбрать отмеченые разделы ".$row0['id']."<br>";  
//*******----------*********


$delmenu = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row0['id']."' ORDER BY `ud`";
$result = mysql_query($delmenu);    // узнали pid раздела по id

while ( $row = mysql_fetch_array($result) )
    {
    echo"узнали pid раздела по id = ".$row['pid']."<br>";

    $delmenu1 = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row['id']."' ORDER BY `ud`";
    $result1 = mysql_query($delmenu1);    // узнали id раздела по pid

    while ( $row1 = mysql_fetch_array($result1) )
        {
                     echo"узнали id раздела по pid = ".$row1['id']."<br>";
        }

    }
}


Но как это РЕКУРСИВНО замутить? huh.gif
И Ваще такое меню это нормально? так кто-нибудь делал?

Спустя 22 минуты, 5 секунд (31.08.2007 - 08:46) md5 написал(а):
удаление child'ов по предку надо вынести в функцию!

function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;

while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}


это тебе общая логика

Спустя 4 минуты, 28 секунд (31.08.2007 - 08:50) Igor написал(а):
Цитата(md5 @ 31.8.2007, 5:46) [snapback]26605[/snapback]
удаление child'ов по предку надо вынести в функцию!

function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;

while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}


это тебе общая логика


Спасибо! Буду пробовать! hi.gif

Спустя 5 часов, 27 минут, 29 секунд (31.08.2007 - 14:18) Igor написал(а):
crying.gif Что-то у меня не получается...
bc.gif

// удаление child'ов по предку надо вынести в функцию!

function del_predok()
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='3'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='".$row['id']."'";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) > 1)
{
del_predok($row['id']);
}

$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}

del_predok('3');


Вот ссылка на описание дерева с SQL и JavaScript и с дистрибутивом для скачивания! Мож это прояснит ситуацию... Думаю многим интересно будет.

http://www.activex.net.ru/docs/phpdtree.shtml

Спустя 29 минут, 29 секунд (31.08.2007 - 14:47) md5 написал(а):
Igor, аааааааааааааааааааааааааааа

Код
function del_by_papa($papa_id)
{
  $query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result))
  {
    $query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
    $result1 = mysql_query($query1);
    if (mysql_num_rows($result1) == 1)
    {
      del_by_papa($row['id']);
    }

    $query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
    $result3 = mysql_query($query3);
  }
}

Спустя 3 минуты, 45 секунд (31.08.2007 - 14:51) Igor написал(а):
Цитата(md5 @ 31.8.2007, 11:47) [snapback]26621[/snapback]
Igor, аааааааааааааааааааааааааааа

Код
function del_by_papa($papa_id)
{
  $query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result))
  {
    $query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
    $result1 = mysql_query($query1);
    if (mysql_num_rows($result1) == 1)
    {
      del_by_papa($row['id']);
    }

    $query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
    $result3 = mysql_query($query3);
  }
}


md5! Я в Функциях не шарю. (только учусь) Вот:

Fatal error: Cannot redeclare del_by_papa() (previously declared in c:\...\_scr\proc.php:27)

Спустя 1 минута, 56 секунд (31.08.2007 - 14:53) md5 написал(а):
ты зачем 2 раза функцию объявляешь?

Спустя 4 минуты, 51 секунда (31.08.2007 - 14:58) Igor написал(а):
Ща пишет Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
И вносит значение "del" в первый и второй уровень дерева а остальные не вносит...

Я правильно делаю?

Код
function del_by_papa()
{

$papa_id=1;
  $query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result))
  {
    $query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
    $result1 = mysql_query($query1);
    if (mysql_num_rows($result1) == 1)
    {
      del_by_papa($row['id']);
    }

    $query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
    $result3 = mysql_query($query3);
  }
}

del_by_papa($papa_id);

Спустя 40 минут, 1 секунда (31.08.2007 - 15:38) md5 написал(а):
везде смотри вывод ошибок
or die mysql_error()

Спустя 1 час, 8 минут, 45 секунд (31.08.2007 - 16:46) Ghost написал(а):
Цитата
md5! Я в Функциях не шарю. (только учусь)

блин, судя по дате регистрации ты с марта учишься.. хм и до сих пор "нешаришь в ф-циях"
в ман трудно посмотреть??

Спустя 1 день, 22 часа, 59 минут, 13 секунд (3.09.2007 - 15:46) Igor написал(а):
MD5! Cпасибо ОГРОМНОЕ!!! rolleyes.gif
Всё работает!

Vasa_c! теперь понятно что ты написал! Спасибо! rolleyes.gif


и всем Спасибо!

Код
function del_by_papa($papa_id)
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `tab` WHERE `pid`='{$papa_id}'";
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result))
  {
    $query1 = "SELECT `id`, `pid` FROM `tab`  WHERE `pid`='".$row['id']."' LIMIT 1";
    $result1 = mysql_query($query1);
    if (mysql_num_rows($result1) == 1)
    {
      del_by_papa($row['id']);
    }
    $query3 = "UPDATE `tab` SET `del`= '1' WHERE `id` = '".$row['id']."'";
    $result3 = mysql_query($query3);
  }
}


del_by_papa();


Спустя 1 час, 24 минуты, 5 секунд (3.09.2007 - 17:10) md5 написал(а):
ага, только вызывая функцию надо первоначальный id передать


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.