Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Запрос для рекурсивной функции

#1 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0
0

Отправлено 23 Июль 2010 - 13:24

$result = $db->sql_query("SELECT a.id, a.module, a.title, a.rights, a.parent, b.read, b.add, b.edit, b.delete, b.right, b.seer, b.coord FROM ".$prefix."_modules AS a, ".$prefix."_mod_access AS b WHERE b.uid=".$user_id." AND a.id=b.mid AND a.id=a.parent ORDER BY a.title");


Данный запрос я сделал для рекурсивной функции. Но, к сожалению, он не извлекает ни одной записи.

В чем моя ошибка?

Для удобства объясню, что поле a.parent содержит id родительского модуля a.id.

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 24 Июль 2010 - 11:57

gaaarfild, попробуй с тремя таблицами. Скорее всего, в моем понимании, ты пытаешься вытащить рекурсивно модули, родителями которых являются модули верхнего уровня.
Попробуй сделать запрос из трех таблиц, а лучше изобрази всё схематично, как ты хочешь получить (скриншот + photoshop)
  • 0

#3 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 25 Июль 2010 - 12:27

Визуально это должно выглядеть как иерархическое дерево. Использую рекурсивную функцию php.
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 25 Июль 2010 - 12:51

gaaarfild, Ну понятное дело что не работает. Как ты пытаешься выбрать элементы относящиеся к родительскому?
Сам подумай, СУБД обрабатывает запрос проверяя каждую строку на выполнение условия. Смотрим:
1) Выбирается первая строка, допустим, условие a.id=b.mid выполняется, а второе a.id=a.parent не выполняется, т.к. элемент сам не может быть себе родительским, запись уже не выбирается
2) Выбирается вторая строка, допустим, условие a.id=b.mid выполняется, а второе a.id=a.parent не выполняется, т.к. элемент сам не может быть себе родительским, запись уже не выбирается
И так далее.
Вот что ты делаешь, получается, что ты делаешь неправильно.

Тебе надо выстроить рекурсивное дерево? Куда помещаешь данные полученные из БД?
  • 0

#5 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 25 Июль 2010 - 13:10

В html. =)
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 25 Июль 2010 - 13:22

gaaarfild, пока ничего не понял, но ошибку я тебе показал. Я строил рекурсивные деревья меню. Данные помещал в безразмерный массив.
Так же была рекурсивная функция, в которую я передавал массив, куда нужно занести дочерние элементы, и передавал id родительского, обрабатывался SQL и вытаскивались дочерние, они так же вызывали эту функцию, передавая в качестве параметров свои подмассивы и так далее.
Скажи что нужно реализовать, сформулируй ТЗ!
  • 0

#7 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 25 Июль 2010 - 15:26

Это система прав. Права в отдельной таблице прописаны для каждого модуля и пользователя. Но некоторые модули - они подмодули родительских модулей.

И мне необходимо организовать древовидную структуру, чтобы назначать права для модулей и подмодулей.

Когда не было иерархии, а были просто модули, все было без проблем. Но когда появился вопрос вложенности модулей, я впал в ступор.

Пью уже третью неделю. Продал квартиру и машину. Живу в картонной коробке с ноутбуком. Скоро зарядка закончится. =))
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 25 Июль 2010 - 22:26

gaaarfild, какого порядка может быть вложенность модулей?
Если у тебя вложенность не выше второго уровня, то есть, подмодули не могут быть родителями, то вот тебе рабочий запрос:
$result = $db->sql_query("SELECT a.id, a.module, a.title, a.rights, a.parent, b.read, b.add, b.edit, b.delete, b.right, b.seer, b.coord FROM ".$prefix."_modules AS a, ".$prefix."_mod_access AS b WHERE b.uid=".$user_id." AND (a.id=b.mid OR a.parent=b.mid) ORDER BY a.title");

Права дочерним, будут присваиваться такие же как и у родительских. Вот что делает запрос:
Выбираем поля id модуля, шифровка модуля, название, правила, родительский, права на чтение, добавление, редактирование, удаление и ещё что-то из таблиц прав доступа и модулей по условию все записи таблицы доступа, соответствующие определенному юзеру И (в этих записях доступа совпадают id модуля ИЛИ id родителя-модуля) сортировка...
  • 0

#9 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 26 Июль 2010 - 00:05

Вложенность нужна неограниченная. И права у каждого модуля свои собственные.
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 26 Июль 2010 - 09:48

gaaarfild, Так если права у каждого модуля и подмодуля свои собственные, не понимаю зачем нужен такой запрос. Ведь если у тебя на каждый модуль хранятся права, то выбор по юзеру даст все модули.
А с большим количеством вложенности тебе нужно сделать примерно так: создание древовидного меню
Создавай безмерный массив, или же одноуровневый, смотря как и что тебе надо. А затем егол используй. Создать подобный массив можно рекурсивно, запрашивая в рекурсии дочерние элементы по полученным id основных модулей.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru