Регистрация
Регистрируясь, вы подтверждаете свое согласие с соглашением об использовании персональных данных.
Восстановление пароля

Проверка наличия подразделов у пунктов меню

28.10.2011, 16:46
msweb
«МастерВеб»
msweb

Зарегистрирован:
2006-05-26
Сообщений: 17

Необходимо выводить "+" в меню, для разделов имеющих подразделы.
Проверку наличия подразделов у каждого пункта меню провожу следующим образом:
Код:

$browse_sub[2][unactive] = "
<a href='%URL'>%NAME</a>".opt_case(listQuery("SELECT COUNT(*) as count FROM Subdivision WHERE Parent_Sub_ID= $data[$i][Subdivision_ID] ", "$data[count]"), "<span>+</span>", "") . "
";

Получаю, что подразделов нет ни в одном разделе, хотя это не так.
P.S.
если в "$data[count]" экранировать $ (\$data[count]) - получаю, что во всех разделах есть подразделы, что также неверно.

msweb
30.10.2011, 01:20
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

Фигню делаете:
1. Забудьте про opt_case(). Используйте тернарный оператор: выражение1? выражение2: выражение3 (см. тут)
2. listQuery тут тоже не айс, лучше заменить на $db->get_var()
3. sql запрос - вам нужен факт наличия хоть одного подкаталога, а не их кол-ва, поэтому использовать count недопустимо, ибо происходит полный перебор всех данных без использования каких-либо индексов, что просто подвесит вашу базу, если разделов будет оч. много. Как минимум надо добавить в запрос "limit 1". Также надо учесть, чтобы выключенные разделы не попадали в эту выборку, т.е. Checked=1.
4. Что такое экранирование и как оно конкретно в данном случае работает - вы понятия вижу не имеете, а оч. зря.

Верное решение (запрос указал другой - он на 1-2 порядка быстрее вашего работает):
Код:

$browse_sub[2][unactive] = "<a href='%URL'>%NAME</a>\".(\$db->get_var(\"select ifnull(exists (select null from `Subdivision` where `Checked`=1 and `Parent_Sub_ID`={\$data[\$i][Subdivision_ID]}),0)\")?'<span>+</span>':null).\"";


зы. И обновите ваш маствеб.ру, ведь 3.55 небезопасная... )

Temet nosce...
198 196 2011-10-30 01:20:52 11639
Описание проекта