|
|
|
| Здравствуйте. Делаю вывод пунктов меню для сайта по книге PHP5 Практика создания web-сайтов. Решение вроде бы нашёл. Но точно не рациональное. Прошу опытных форумчан взглянуть и подсказать более рациональное решение если оно есть.
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
...
Мой вариант решения:
<?
//Соединяемся с бд
require_once($_SERVER["DOCUMENT_ROOT"]."/admin/config.php");
//Количество пунктов меню которые разрешено вывести $pos_number
$pos_number = 5;
//Извлекаем всё из таблицы menu
$query= "Select from menu";
$one= mysql_query($query);
if (!$one)
{
echo mysql_error();
}
else
{
//Если извлечение успешно, то помещаем результат в массив
$menu = mysql_fetch_assoc($one);
}
?>
Таблица вывода значений пунктов меню
<table>
<?
//Начало цикла вывода пунктов меню, количество проходов равно количеству пунктов меню в переменной $pos_number
for ($i=1; $i<= $pos_number; $i++)
{
//Проверяем стратус страницы на которую ведёт пункт меню. Если Раздел/Статья, то извлекаем данные из таблицы разделов/статей
//Если раздел, выводим в строку порядковый номер пункта меню и название радела
if($menu['part_art']=1)
{
$query = sptintf("Select name from artpage where id_artpage = %d", $menu['id']);
$zapros = mysql_query($query);
if(!$zapros) puterror (mysql_error());
$menu_name = mysql_fetch_assoc($one);
echo "<td>".$menu['num']."</td><td>".$menu_name['name']."</td></tr>";
}
//Если статья, выводим в строку порядковый номер пункта меню и название статьи
else
{
$query = sptintf("Select name from articles where id_article = %d", $menu['id']);
$zapros = mysql_query($query);
if(!$zapros) puterror (mysql_error());
$menu_name = mysql_fetch_assoc($one);
echo "<td>".$menu['num']."</td><td>".$menu_name['name']."</td></tr>";
}
}
</table>
?>
|
Решение мне кажется не изящным в части постоянных запросов к бд в ходе выполнения цикла.
и, таблица выводится не отсортированной по номеру пунктов меню. Как правильно построить SQL запрос на выборку сразу значений name из обеих таблиц.. | |
|
|
|
|
|
|
|
для: zuldd
(05.11.2010 в 22:50)
| | Вот здесь if($menu['part_art']=1) скорей всего правильней будет if($menu['part_art'] == 1)
Если Вы задали кол-во пунктов меню которые разрешено вывести в переменной $pos_number, то может лучше будет использовать в запросе "сам_запрос LIMIT $pos_number"? При этом Вам из таблицы выбирет только 5 записей. | |
|
|
|
|
|
|
|
для: Slo_Nik
(05.11.2010 в 22:56)
| | Особенно интересует рациональность подхода "опрашивания" БД при каждом прогоне цикла... .
Вот думал не лучше-ли будет сразу извлечь все данные одним запросом по именам пунктов меню (поле name таблиц articles и artpages), и потмо в теле цикла просто подставлять нужный элемент массива в ячейку таблицы. И, если лучше, то какой вид должен принять SQL-запрос
upd.
в листинге в первом посте ошибочка в указании идентификатора запроса к бд $zapros а не $one, но не суть
upd.
$pos_number. Да его можно взять за лимит. Но запрос должен извлекать поля "name" из двух таблиц сразу..
sprintf("Select name from artpages, articles where %1\d = id_artpage or %1\d = id_article limit %2\d", menu[id], $pos_number)
|
Правильно-ли это?
upd.
проблема решена удалением ошибок в запросе) | |
|
|
|