Подскажите пожалуйста. как лучше реализовать категории новостей (в моём случае)

  • Автор темы BeatBox
  • Дата начала

BeatBox

Guest
Подскажите пожалуйста. как лучше реализовать категории новостей (в моём случае)

Сдравствуйте.
У меня слудеющий вопросец:
при добавлении новости на моем сайте, нужно что бы автор (обычно это админ) выбирал одну или несколько категорий, к которой относиться новость. Всего таких категорий должно ровно 34. Вот я и думаю, как мне это реализовать удобнее.
Пока что представляеться такой вариант:
добавить в таблицу новостей 34 поля INT(1) и при добавлении новости Checkbox'ами выбирать подходящие разделы. Впринципе вариант удобный, и поик будет удобно делать, но вот незнаю я - наскольк вообще допустимо такое колличество аолей в БД, учитывая что уже 10 есть? Нормально ли это? Практикуют ли так профессиональные РНР-программисты?
Спасибо за внимание ;)
 

neko

tеam neko
связать новости с категориями черезе третью таблицу
 

Фанат

oncle terrible
Команда форума
нет не нормально.
Нет, не практикуют.
делается таблица с категориями и таблица связей между категориями и новостями.
И при добавлении новостей добавляются записи не в колонки, а в строки этой таблицы связей. id новости и id категорий
 

BeatBox

Guest
Вы немогли бы пожалуйста чуточку поподронее?
 

phpfun

Guest
Выбор категории при добавлении новости лучше сделать через поле select чем через checkbox ы как мне кажеца
 

Kelkos

Сам себе программер
Выбор категории при добавлении новости лучше сделать через поле select чем через checkbox ы как мне кажеца
неправильно кажется.
Вы немогли бы пожалуйста чуточку поподронее?
Могли бы.
Делаешь таблицу в которой есть поля source_id_news и id_catalog ну и создаёшь "связки" id новости с id раздела.
Вообщем, подумай над этим.. и всё поймёшь.
(кстати, не забудь, что категории тоже в отдельной таблице должны быть)
 

BeatBox

Guest
Спасибо. я все-таки решил взять категории и сделать по принципу php-nuke. получилось неплохо. Все также как вы и сказали. Теперь у меня проблемка:
я сделал код, который должен вывести под новостью перечень категорий, в которые входит статья.
Сами эти категории выбираються когда добавляю новость, и ID'шники категорий записывають в БД в одном поле через ТИРЕ.
Вот сам код:
PHP:
 list($arow, $atop) = $db->sql_fetchrow($db->sql_query("SELECT s.associated, t.topictext FROM ".$prefix."_stories AS s,".$prefix."_topics AS t  WHERE s.sid='$s_sid' AND t.topicid=s.associated")); 
if ($arow != "") { 
 $morelink = "<div align=right><A href=\"page.php?name=all_news\"><IMG class=cats_pic alt=\"&#202;&#224;&#242;&#229;&#227;&#238;&#240;&#232;&#232; &#237;&#238;&#226;&#238;&#241;&#242;&#229;&#233;\" 
            src=\"/i/icon_cats.gif\" align=absMiddle border=\"0\"></A>: "; 
       $asso_t = explode("-",$arow); 
        for ($i=0; $i<count($asso_t); $i++) { 
        if ($asso_t[$i] != "") { 
            $morelink .= "<a class=s2 href=\"page.php?name=News&new_topic=$asso_t[$i]\"><u>$atop</u></a>, "; 
            } 

        }
При выводе код выводит все нужные категории (которые были выставлены во время создании новости). Даёт на них правельные ссылки, НО называються он все одинаково. Незнаю как это исправить :(
Код писал не я и моих познаний хватает лишь чтобы писать простые коды и сам с ним разобраться немогу.
Помогите, пожалуйста.
 

SelenIT

IT-лунатик :)
BeatBox
У тебя сейчас вообще не выбираются названия категорий, название берется от новости. Чтобы при твоей схеме получить названия категорий, нужно сделать как минимум один дополнительный запрос к таблице категорий. А если делать нормально - можно вытянуть все сразу через объедиение трех таблиц.

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

BeatBox

Guest
Здравствуйте!
Мне тут код подредактировали, но впринципе масло маслянное - теперь выводяться названия и прочее, но выполняеться на 35 обращений в БД больше обычного. Можете пожалуйста помочь подправить код?
PHP:
     list($arow, $atop) = $db->sql_fetchrow($db->sql_query("SELECT s.associated, t.topictext FROM ".$prefix."_stories AS s,".$prefix."_topics AS t  WHERE s.sid='$s_sid' AND t.topicid=s.associated")); 
        if ($arow != "") { 
        $morelink = "<div align=right><A href=\"page.php?name=all_news\"><IMG class=cats_pic alt=\"Связанные темы\" 
        src=\"/i/icon_cats.gif\" align=absMiddle border=\"0\"></A>: "; 
        $asso_t = explode("-",$arow); 
        for ($i=0; $i<count($asso_t); $i++) { 
        if ($asso_t[$i] != "") { $row = $db->sql_fetchrow($db->sql_query(" SELECT topictext FROM ".$prefix."_topics WHERE topicid='$asso_t[$i]'" 
        )); 
        $morelink .= "<a class=s2 
        href=\"page.php?name=News&amp;new_topic=$asso_t[$i]\"><u> 
        ".$row['topictext']."</u></a>, "; 
        }}}
 

SelenIT

IT-лунатик :)
Подставляй в запрос массив id-шек. Используй конструкцию вида where id=$id[0] or id=$id[1] or ... или же оператор IN(...). Для упрощения реализации второго варианта, пожалуй, есть смысл поменять символ-разделитель.
 

BeatBox

Guest
Если несложно - можно более подробнее? я от скриптов сайта уже 3 суток вообще неотхожу :) Голова уже не особо варит, а время жмет :(

-~{}~ 09.03.05 20:07:

помогите пожалуйста оптимизировать код (выше)
 

Фанат

oncle terrible
Команда форума
записывай айдишники не через тире, а через запятую.
достаешь это поле, и подставляешь его в другой запрос, вида
select * from table where id in($idshniki)

андестенд?
 

BeatBox

Guest
Фанат
Спасибо, сейчас попробую ;)

-~{}~ 09.03.05 20:33:

Всеравно кол-во запросов в БД не меняеться :(

-~{}~ 09.03.05 20:40:

вот смотрите:
PHP:
if ($asociated != "") {
        $morelink = "<div align=right><A href=\"page.php?name=all_news\"><IMG class=cats_pic alt=\"&#202;&#224;&#242;&#229;&#227;&#238;&#240;&#232;&#232; &#237;&#238;&#226;&#238;&#241;&#242;&#229;&#233;\"
        src=\"/i/icon_cats.gif\" align=absMiddle border=\"0\"></A>: ";
        $asso_t = explode("-",$asociated);
        for ($i=0; $i<count($asso_t); $i++) {

        if ($asso_t[$i] != "") { $row = $db->sql_fetchrow($db->sql_query(" SELECT topictext FROM ".$prefix."_topics WHERE topicid in ($asso_t[$i])"
        ));
        $morelink .= "<a class=s2
        href=\"page.php?name=News&amp;new_topic=$asso_t[$i]\"><u>
        ".$row['topictext']."</u></a>, ";
        }}}
переменная $asociated береться раньше, при выводе текста новости.
но всеравно этот код даёт огромное кол-во запросов в БД :(
 

SiMM

Новичок
> for ($i=0; $i<count($asso_t); $i++) {
С помощью этого цикла можно подготовить запрос, а потом выполнить его.
 

Фанат

oncle terrible
Команда форума
кто-нибудь объяснит мне - что делает этот код и зачем?
и какое он имеет отношение к первому вопросу?

-~{}~ 09.03.05 22:36:

BeatBox
выбери ОДИН РАЗ ВСЕ названия категорий.
в МАССИВ.
в котором индексом будет ид категории, а значением - название.
и вместо обращения к бд делай обращение к массиву.

ферштеен?
 

BeatBox

Guest
Фанат
этот коды выводит ПОД новостью категории, к которым она относиться.

Спасибо за ответ :) Единственное что - что такое массив? :D Обьясните пожалуйста как его правильно состаить?
 

BeatBox

Guest
прочитал, но так и непонял :( а скрипт нужно уже доделать :(
 

SelenIT

IT-лунатик :)
В твоем случае нужен массив вида
PHP:
$categories = array(1=>"Новости науки", 3=>"Новости культуры", ... 958=>"Новости непонятно чего");
Составляется он в цикле - как ты уже не раз делал. Перед выборкой всех категорий из базы инициализируешь пустой массив:
PHP:
$categories = array();
а в цикле при выборке очередной строки результата добавляешь в массив элемент с соответствующим индексом:
PHP:
list($category_id, $category_title) = $db->sql_fetchrow(.... //тут результат запроса
$categories[$category_id] = $category_title;
Потом, когда получишь свои id-ы категорий для новости, простейшим циклом выведешь соответствующие названия:
PHP:
for ($i=0, $cat_num = count($asso_t); $i<$cat_num;  $i++) {
   echo $categories[$asso_t[$i]]; // нужное оформление добавить по вкусу)
}
 

BeatBox

Guest
SelenIT
Спасибо большое! Буду делать немного позже, но вроде бы понял все ;) Ещё заз спасибо :)
 
Сверху