Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Динамичное двумерное меню
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Приветствую...
Написал меню с админкой, откуда можно добавлять подменю в каждую из категорий меню а так же создавать новые категории. Но решение кажется мне сомнительным с одной стороны, а с другой - иного варианта не вижу. Прошу помочь мне разобраться. После кода опишу то, в чем заключается мое сомнение...
$result=$db->query("SELECT `id`, `name` FROM `parentmenu`");
while($row=$result->fetch_assoc()){
echo$row['name']."<br />";
$query=$db->query("SELECT `sub_name` FROM `submenu` WHERE `parentid`=$row[id]") or die($db->error);
while($res=$query->fetch_assoc()){
echo"<ol>";
echo$res['sub_name']."<br />";
echo"</ol>";
}
}
Как многие из вас поняли, этот кусок кода отвечает за вывод основного меню и его подменю.
Вообщем получается так, чтобы достать подменю приходится 100500 раз обращаться к БД, что на мой взгляд не есть хорошо... Хочется как то переложить это дело на только на плечи php не затрагивая при этом обращение к БД.
Точнее выполнить запрос всего 1 раз и получить нужный результат. Не могу придумать как, точнее пробовал парочку вариантов, но это не то... подменю в таком случае выводится криво. Но с другой стороны я думаю что меню обычно не так много и это не нанесет особого вреда пусть даже если запрос будет выполнен х20 раз...
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
объеденить таблицы в 1ну
у основного меню парент будет 0
разбери одним запросом в массив
какой массив получится думаю догадаешься
вполне сойдет для меню вариант
teddy
Отправлено: 01 Июля, 2013 - 01:13:14
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
caballero
У меня две таблицы, в одной хранится список основного меню, а в другой подменю... LIME
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy нафига тебе JOIN
храни все в 1ой таблице
хотя если извращаться то через UNION c сортировкой ORDER по паренту и кастомным полям
типа ..., o AS im_from_main (Добавление)
а еще я бы наверное всетаки хранил его(меню) в виде готового сериализованного массива
нафига эти запросы если каждый раз его целиком получать
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME пишет:
нафига тебе JOIN
Где то месяц назад ходил на собеседку, одно из заданий было похожим... Нужно было создать структуру БД для похожей ситуации, тогда я составил одну таблицу и мне начали петь песни, что это не правильно типа получается каша и все такое...
LIME пишет:
а еще я бы наверное всетаки хранил его(меню) в виде готового сериализованного массива
Тоже интересный вариант, его наверное и возьму за основу )
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
teddy пишет:
Где то месяц назад ходил на собеседку, одно из заданий было похожим... Нужно было создать структуру БД для похожей ситуации, тогда я составил одну таблицу и мне начали петь песни, что это не правильно типа получается каша и все такое...
две таблицы - в самый раз
1. menuitems
ID - идентификатор пункта меню
MENU_ID - идентификатор меню, к которому относится этот пункт
PARENT_ID - идентификатор родительского пункт для вложенных подменю
TITLE - заголовок и прочие поля
2. menus
ID - идентификатор меню
TITLE - заголовок, в основном для админки, чтобы назначать вывод менюшки в шаблонах
Первую таблицу можно при желании модифицировать под другую структуру хранения дерева, сути это не меняет.
а далее работаем с полученным массивом на стороне php - формируем дерево, и выводим вложенными списками.
teddy пишет:
Точнее выполнить запрос всего 1 раз и получить нужный результат. Не могу придумать как, точнее пробовал парочку вариантов, но это не то... подменю в таком случае выводится криво.
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar
Возможно они добавили яйца когда я ушел, никто этого не исключает ) но я готовил без яиц )
DelphinPRO пишет:
TITLE - заголовок и прочие поля
Ага, я просто для начала не установил его так как делал всё по минимуму... задачей в первую очередь было то, что бы привести скрипт в рабочее состояние.. у меня пока даже a href нет )
Спасибо за ещё один предложенный вариант, я обязательно посмотрю, только сейчас чуть отвлекся в другом направлении(не PHP), но как разгружусь - посмотрю что да как)
LIME
Отправлено: 01 Июля, 2013 - 12:10:36
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
DelphinPRO очень...очень плохой подход (Добавление)
нафига тут вообще бд?
бд хорошо при строительстве дерева с неограниченной вложенностью и/или какой-то выборке по условиям
а тут все просто как табуретка
надо получить массив - так храни сразу массив (Добавление)
если уж в бд хранить то лучше добавить поле для индексации очередности
и строить меню сразу при выборке(без массива)
чтоб не бегать цикл несколько раз
DelphinPRO
Отправлено: 01 Июля, 2013 - 14:26:28
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
LIME кеширование результатов запросов никто не отменял ;)
----- Чем больше узнаю, тем больше я не знаю.
LIME
Отправлено: 01 Июля, 2013 - 18:40:23
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
DelphinPRO а причем тут кеширование...это непричем...внимательнее))...нужны пояснения? (Добавление)
читал ведь про nested sets/вложенные множества ?
можно ведь только левым ключом обойтись в данном конкретном случае
ну уж если извращаться (Добавление)
хотф непонятно зачем кешировать то что можно хранить явно
твой кэш это и будет тот массив что можно сразу хранить ...нет?
DelphinPRO
Отправлено: 01 Июля, 2013 - 20:49:58
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
LIME пишет:
читал ведь про nested sets/вложенные множества ?
читал, знаю. считаю для меню неактуальным. особенно для новичков. там довольно сложные запросы на выборку. можно конечно взять их готовыми..
хранение дерева как id-parent_id - самое простое для понимания, и несложное в реализации.
да, в nested sets можно быстро достать часть дерева, но оно нужно? если меню обычно всё целиком отображается?
LIME пишет:
хотф непонятно зачем кешировать то что можно хранить явно
очевидно, что если это малюсенький сайтик, в котором небольшое меню, которое не предполагается редактировать, то можно и просто в массиве хранить. В остальных случаях, данными, хранимыми в БД, все же удобнее оперировать.
LIME пишет:
твой кэш это и будет тот массив что можно сразу хранить ...нет?
да. А почему его не надо кешировать? админ отредактировал меню - система закешировала изменения и всё. Система больше за менюхой в базу не полезет при каждом запросе.
----- Чем больше узнаю, тем больше я не знаю.
LIME
Отправлено: 01 Июля, 2013 - 21:05:24
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.