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 :: Динамичное двумерное меню

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
teddy
Отправлено: 01 Июля, 2013 - 00:33:11
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Приветствую...

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

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 раз...

Помогите разобраться, пожалуйста )

(Отредактировано автором: 01 Июля, 2013 - 00:43:37)

 
 Top
caballero
Отправлено: 01 Июля, 2013 - 00:44:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




выбрать из базы всю таблицу и бегать циклом уже по массиву


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
LIME
Отправлено: 01 Июля, 2013 - 00:47:00
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




объеденить таблицы в 1ну
у основного меню парент будет 0
разбери одним запросом в массив
какой массив получится думаю догадаешься
вполне сойдет для меню вариант
 
 Top
teddy
Отправлено: 01 Июля, 2013 - 01:13:14
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




caballero
У меня две таблицы, в одной хранится список основного меню, а в другой подменю...
LIME

Спасибо

(Отредактировано автором: 01 Июля, 2013 - 08:44:41)

 
 Top
LIME
Отправлено: 01 Июля, 2013 - 08:43:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




teddy нафига тебе JOIN
храни все в 1ой таблице
хотя если извращаться то через UNION c сортировкой ORDER по паренту и кастомным полям
типа ..., o AS im_from_main
(Добавление)
а еще я бы наверное всетаки хранил его(меню) в виде готового сериализованного массива
нафига эти запросы если каждый раз его целиком получать

(Отредактировано автором: 01 Июля, 2013 - 08:43:31)

 
 Top
teddy
Отправлено: 01 Июля, 2013 - 09:07:19
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




LIME пишет:
нафига тебе JOIN

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

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

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

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

Спасибо )

(Отредактировано автором: 01 Июля, 2013 - 09:16:31)

 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Июля, 2013 - 09:31:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)





teddy пишет:
каша
с яйцами?
 
 Top
DelphinPRO
Отправлено: 01 Июля, 2013 - 10:53:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
teddy
Отправлено: 01 Июля, 2013 - 11:04:34
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DeepVarvar


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


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

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

Спасибо за ещё один предложенный вариант, я обязательно посмотрю, только сейчас чуть отвлекся в другом направлении(не PHP), но как разгружусь - посмотрю что да как)
 
 Top
LIME
Отправлено: 01 Июля, 2013 - 12:10:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DelphinPRO очень...очень плохой подход
(Добавление)
нафига тут вообще бд?
бд хорошо при строительстве дерева с неограниченной вложенностью и/или какой-то выборке по условиям
а тут все просто как табуретка
надо получить массив - так храни сразу массив
(Добавление)
если уж в бд хранить то лучше добавить поле для индексации очередности
и строить меню сразу при выборке(без массива)
чтоб не бегать цикл несколько раз
 
 Top
DelphinPRO
Отправлено: 01 Июля, 2013 - 14:26:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




LIME кеширование результатов запросов никто не отменял ;)


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
LIME
Отправлено: 01 Июля, 2013 - 18:40:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DelphinPRO а причем тут кеширование...это непричем...внимательнее))...нужны пояснения?
(Добавление)
читал ведь про nested sets/вложенные множества ?
можно ведь только левым ключом обойтись в данном конкретном случае
ну уж если извращаться
(Добавление)
хотф непонятно зачем кешировать то что можно хранить явно
твой кэш это и будет тот массив что можно сразу хранить ...нет?
 
 Top
DelphinPRO
Отправлено: 01 Июля, 2013 - 20:49:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




LIME пишет:
читал ведь про nested sets/вложенные множества ?

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

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

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

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

да. А почему его не надо кешировать? админ отредактировал меню - система закешировала изменения и всё. Система больше за менюхой в базу не полезет при каждом запросе.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
LIME
Отправлено: 01 Июля, 2013 - 21:05:24
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




скука...не услышал
оправдываешься...не интересно...я ушел
 
 Top
DelphinPRO
Отправлено: 01 Июля, 2013 - 21:34:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




LIME пишет:
я ушел
не, так не пойдет. аргументируй. )


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB