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 » PHP » Программирование на PHP » Некрасивое решение :(

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

1. Zuldek - 05 Ноября, 2010 - 20:39:50 - перейти к сообщению
Всем здравствуйте.
Кроплю над страницей вывода пунктов меню навигации.
Задача вроде бы решена, но, совсем не рационально Недовольство, огорчение Прошу более опытных форумчан взглянуть на решение.
есть 3 таблицы

menu
---------------------
num | part_art | id

num - порядковый номер пункта меню для вывода на сайте
part_art - хранит тип страницы на которую ведёт пункт меню (1/0 - раздел/статья)
id - идентификатор статья или раздела. Равен id_article из таблицы статей для статьи либо id_artpage из таблицы разделов, соответственно для раздела.

aricle
-------------------
id_article | name

artpage
---------------------
id_artpage | name

Результатом работы скрипта должна стать -
таблица - порядок отображения пунктов меню на сайте
1 РазделN
2 СтатьяN
3 СтатьяС
4 РазделA
...

Моё решение:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?
  3. //Соединяемся с бд
  4. require_once($_SERVER["DOCUMENT_ROOT"]."/admin/config.php");
  5. //Количество пунктов меню которые разрешено вывести $pos_number
  6. $pos_number = 5;
  7. //Извлекаем всё из таблицы menu
  8. $query= "Select from menu";
  9. $one= mysql_query($query);
  10. if (!$one)
  11. {
  12. echo mysql_error();
  13. }
  14. else
  15. {
  16. //Если извлечение успешно, то помещаем результат в массив
  17. $menu = mysql_fetch_assoc($one);
  18. }
  19. ?>
  20. //Таблица вывода значений пунктов меню
  21. <table>
  22. <?
  23. //Начало цикла вывода пунктов меню, количество проходов равно количеству пунктов меню в переменной $pos_number
  24. for ($i=1; $i<= $pos_number; $i++)
  25. {
  26. //Проверяем стратус страницы на которую ведёт пункт меню. Если Раздел/Статья, то извлекаем данные из таблицы разделов/статей
  27. //Если раздел, выводим в строку порядковый номер пункта меню и название радела
  28. if($menu['part_art']=1)
  29.         {
  30.                 $query = sptintf("Select name from artpage where id_artpage = %d", $menu['id']);
  31.                 $zapros = mysql_query($query);
  32.                 if(!$zapros) puterror (mysql_error());
  33.                 $menu_name = mysql_fetch_assoc($zapros);
  34.                 echo "<td>".$menu['num']."</td><td>".$menu_name['name']."</td></tr>";
  35.         }
  36. //Если статья, выводим в строку порядковый номер пункта меню и название статьи
  37. else
  38.         {
  39.                 $query = sptintf("Select name from articles where id_article = %d", $menu['id']);
  40.                 $zapros = mysql_query($query);
  41.                 if(!$zapros) puterror (mysql_error());
  42.                 $menu_name = mysql_fetch_assoc($zapros);
  43.                 echo "<td>".$menu['num']."</td><td>".$menu_name['name']."</td></tr>";          
  44.         }
  45. }
  46. </table>
  47. ?>

Решение мне кажется не изящным в части постоянных запросов к бд в ходе выполнения цикла.
и, таблица выводится не отсортированной по номеру пунктов меню.
Более опытные форумчане поскажите как правильно построить скрипт, особенно SQL запрос на выбору сразу всех значений из обеих таблиц..

(Добавил)
То есть нужно извлекать значения полей name из таблиц разделов и статей, так чтобы id таблицы меню был равен id_artpage или id_article, поскольку в меню может попасть и раздел и статья...
CODE (htmlphp):
скопировать код в буфер обмена
  1. sprintf("Select name from artpages, articles where %d = id_artpage or %d = id_article", menu[id])

правильно?
2. DlTA - 05 Ноября, 2010 - 21:30:16 - перейти к сообщению
а это все правильно работает?
3. Zuldek - 05 Ноября, 2010 - 21:40:34 - перейти к сообщению
DlTA пишет:
а это все правильно работает?


Не тестировал, но не суть, - логика правильная.. и чувствую что можно сделать всё проще и изящнее (Если вы про ошибочки в синтаксисе небольшие Закатив глазки )

 

Powered by ExBB FM 1.0 RC1