Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите рационально решить задачу
 
 автор: zuldd   (05.11.2010 в 22:50)   письмо автору
 
 

Здравствуйте. Делаю вывод пунктов меню для сайта по книге 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";
$onemysql_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(!
$zaprosputerror (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(!
$zaprosputerror (mysql_error());
                
$menu_name mysql_fetch_assoc($one);
                echo 
"<td>".$menu['num']."</td><td>".$menu_name['name']."</td></tr>";          
        }
}
</
table>
?>


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

  Ответить  
 
 автор: Slo_Nik   (05.11.2010 в 22:56)   письмо автору
 
   для: zuldd   (05.11.2010 в 22:50)
 

Вот здесь if($menu['part_art']=1) скорей всего правильней будет if($menu['part_art'] == 1)
Если Вы задали кол-во пунктов меню которые разрешено вывести в переменной $pos_number, то может лучше будет использовать в запросе "сам_запрос LIMIT $pos_number"? При этом Вам из таблицы выбирет только 5 записей.

  Ответить  
 
 автор: zuldd   (05.11.2010 в 23:17)   письмо автору
 
   для: 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.
проблема решена удалением ошибок в запросе)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования