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
Форумы портала PHP.SU :: Версия для печати :: Динамичное двумерное меню
Форумы портала PHP.SU » » Вопросы новичков » Динамичное двумерное меню

Страниц (2): [1] 2 »
 

1. teddy - 01 Июля, 2013 - 00:33:11 - перейти к сообщению
Приветствую...

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

PHP:
скопировать код в буфер обмена
  1.  
  2. include "/last/connect.php";
  3.  
  4. $result = $db->query("SELECT `id`, `name` FROM `parentmenu`");
  5.        
  6.     while($row = $result->fetch_assoc()){
  7.                
  8.         echo $row['name']."<br />";
  9.                        
  10.             $query = $db->query("SELECT `sub_name` FROM `submenu` WHERE `parentid`=$row[id]") or die($db->error);
  11.                        
  12.                        
  13.         while($res = $query->fetch_assoc()){
  14.                        
  15.         echo "<ol>";
  16.                        
  17.             echo $res['sub_name']."<br />";
  18.                        
  19.         echo "</ol>";
  20.     }
  21. }
  22.  

Как многие из вас поняли, этот кусок кода отвечает за вывод основного меню и его подменю.

Вообщем получается так, чтобы достать подменю приходится 100500 раз обращаться к БД, что на мой взгляд не есть хорошо... Хочется как то переложить это дело на только на плечи php не затрагивая при этом обращение к БД.

Точнее выполнить запрос всего 1 раз и получить нужный результат. Не могу придумать как, точнее пробовал парочку вариантов, но это не то... подменю в таком случае выводится криво. Но с другой стороны я думаю что меню обычно не так много и это не нанесет особого вреда пусть даже если запрос будет выполнен х20 раз...

Помогите разобраться, пожалуйста )
2. caballero - 01 Июля, 2013 - 00:44:16 - перейти к сообщению
выбрать из базы всю таблицу и бегать циклом уже по массиву
3. LIME - 01 Июля, 2013 - 00:47:00 - перейти к сообщению
объеденить таблицы в 1ну
у основного меню парент будет 0
разбери одним запросом в массив
какой массив получится думаю догадаешься
вполне сойдет для меню вариант
4. teddy - 01 Июля, 2013 - 01:13:14 - перейти к сообщению
caballero
У меня две таблицы, в одной хранится список основного меню, а в другой подменю...
LIME

Спасибо
5. LIME - 01 Июля, 2013 - 08:43:15 - перейти к сообщению
teddy нафига тебе JOIN
храни все в 1ой таблице
хотя если извращаться то через UNION c сортировкой ORDER по паренту и кастомным полям
типа ..., o AS im_from_main
(Добавление)
а еще я бы наверное всетаки хранил его(меню) в виде готового сериализованного массива
нафига эти запросы если каждый раз его целиком получать
6. teddy - 01 Июля, 2013 - 09:07:19 - перейти к сообщению
LIME пишет:
нафига тебе JOIN

Где то месяц назад ходил на собеседку, одно из заданий было похожим... Нужно было создать структуру БД для похожей ситуации, тогда я составил одну таблицу и мне начали петь песни, что это не правильно типа получается каша и все такое...

LIME пишет:
а еще я бы наверное всетаки хранил его(меню) в виде готового сериализованного массива

Тоже интересный вариант, его наверное и возьму за основу )

Попробую всё переделывать...

Спасибо )
7. DeepVarvar - 01 Июля, 2013 - 09:31:10 - перейти к сообщению

teddy пишет:
каша
с яйцами?
8. DelphinPRO - 01 Июля, 2013 - 10:53:20 - перейти к сообщению
teddy пишет:
Где то месяц назад ходил на собеседку, одно из заданий было похожим... Нужно было создать структуру БД для похожей ситуации, тогда я составил одну таблицу и мне начали петь песни, что это не правильно типа получается каша и все такое...


две таблицы - в самый раз

1. menuitems
ID - идентификатор пункта меню
MENU_ID - идентификатор меню, к которому относится этот пункт
PARENT_ID - идентификатор родительского пункт для вложенных подменю
TITLE - заголовок и прочие поля

2. menus
ID - идентификатор меню
TITLE - заголовок, в основном для админки, чтобы назначать вывод менюшки в шаблонах

Первую таблицу можно при желании модифицировать под другую структуру хранения дерева, сути это не меняет.

Выборка всего меню -
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM menuitems WHERE menu_id=1

а далее работаем с полученным массивом на стороне php - формируем дерево, и выводим вложенными списками.

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


Вот здесь я показывал как я делаю меню
http://forum.php.su/topic.php?fo...40195#1344340195
а здесь приводил примеры кода
http://forum.php.su/topic.php?fo...26302#1331726302
9. teddy - 01 Июля, 2013 - 11:04:34 - перейти к сообщению
DeepVarvar


Радость
Возможно они добавили яйца когда я ушел, никто этого не исключает ) но я готовил без яиц )


DelphinPRO пишет:
TITLE - заголовок и прочие поля

Ага, я просто для начала не установил его так как делал всё по минимуму... задачей в первую очередь было то, что бы привести скрипт в рабочее состояние.. у меня пока даже a href нет )

Спасибо за ещё один предложенный вариант, я обязательно посмотрю, только сейчас чуть отвлекся в другом направлении(не PHP), но как разгружусь - посмотрю что да как)
10. LIME - 01 Июля, 2013 - 12:10:36 - перейти к сообщению
DelphinPRO очень...очень плохой подход
(Добавление)
нафига тут вообще бд?
бд хорошо при строительстве дерева с неограниченной вложенностью и/или какой-то выборке по условиям
а тут все просто как табуретка
надо получить массив - так храни сразу массив
(Добавление)
если уж в бд хранить то лучше добавить поле для индексации очередности
и строить меню сразу при выборке(без массива)
чтоб не бегать цикл несколько раз
11. DelphinPRO - 01 Июля, 2013 - 14:26:28 - перейти к сообщению
LIME кеширование результатов запросов никто не отменял ;)
12. LIME - 01 Июля, 2013 - 18:40:23 - перейти к сообщению
DelphinPRO а причем тут кеширование...это непричем...внимательнее))...нужны пояснения?
(Добавление)
читал ведь про nested sets/вложенные множества ?
можно ведь только левым ключом обойтись в данном конкретном случае
ну уж если извращаться
(Добавление)
хотф непонятно зачем кешировать то что можно хранить явно
твой кэш это и будет тот массив что можно сразу хранить ...нет?
13. DelphinPRO - 01 Июля, 2013 - 20:49:58 - перейти к сообщению
LIME пишет:
читал ведь про nested sets/вложенные множества ?

читал, знаю. считаю для меню неактуальным. особенно для новичков. там довольно сложные запросы на выборку. можно конечно взять их готовыми..
хранение дерева как id-parent_id - самое простое для понимания, и несложное в реализации.
да, в nested sets можно быстро достать часть дерева, но оно нужно? если меню обычно всё целиком отображается?

LIME пишет:
хотф непонятно зачем кешировать то что можно хранить явно

очевидно, что если это малюсенький сайтик, в котором небольшое меню, которое не предполагается редактировать, то можно и просто в массиве хранить. В остальных случаях, данными, хранимыми в БД, все же удобнее оперировать.

LIME пишет:
твой кэш это и будет тот массив что можно сразу хранить ...нет?

да. А почему его не надо кешировать? админ отредактировал меню - система закешировала изменения и всё. Система больше за менюхой в базу не полезет при каждом запросе.
14. LIME - 01 Июля, 2013 - 21:05:24 - перейти к сообщению
скука...не услышал
оправдываешься...не интересно...я ушел
15. DelphinPRO - 01 Июля, 2013 - 21:34:29 - перейти к сообщению
LIME пишет:
я ушел
не, так не пойдет. аргументируй. )

 

Powered by ExBB FM 1.0 RC1