Система тегов

Тема в разделе "PHP", создана пользователем Sochniy, 25 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Sochniy

    Sochniy Постоялец

    Регистр.:
    1 май 2009
    Сообщения:
    84
    Симпатии:
    6
    Подскажите пожалуйста, пишу движок, нужно что-то по типу системы тегов (ключевых слов).

    При вводе новости есть поле "теги", заполняем через запятую, затем они должны разделятся (по запятой) и попадать в таблицу.
    Соответственно чтобы можно было новости по этим тегам сортировать. А также нужна функция вывода по двух, трем тегам и т.д.

    теперь ломаю голову как это все лучше организовать?

    Добавлено через 14 минут
    полистал форум, нашел хорошую статью:
    http://www.simplecoding.org/kak-sozdat-oblako-tegov-dlya-svoego-sajta.html
    Сейчас изучаю и буду пробовать.

    Подскажите как реализовать следующее:
    юзер вводит в строку поиска пару слов (или словосочетаний), разделяя их запятой, а ему выводятся записи, содержащие эти теги (равные словам, которые он ввел).
    Как разбивать запрос на отдельные составляющие и как производить поиск?
     
  2. vilk108

    vilk108

    Регистр.:
    17 дек 2007
    Сообщения:
    174
    Симпатии:
    41
    Разбить запрос можно через explode.
    Например -
    PHP:
    $tags  "one,two";
    $explode explode(","$tags);
    echo 
    $explode[0]; // one
    echo $explode[1]; // two
     
    Sochniy нравится это.
  3. Sochniy

    Sochniy Постоялец

    Регистр.:
    1 май 2009
    Сообщения:
    84
    Симпатии:
    6
    спасибо, с этим, а также с убиранием пробелов я уже разобрался. Сейчас нужна помощь именно в обращении к базе.
     
  4. hazg

    hazg Прохожие

    Ну собственно 2 варианта, которые сразу в голову лезут:

    1)
    в базу пишем теги как есть, а выборку делаем вроде того: ...WHERE tags LIKE "%$tag%"

    2)
    Делаем таблицу тегов (id, title)
    Делаем таблицу, для привязки тегов к материалам (tag_id, post_id)
    при добавлении материала, парсим теги (explode(...)), вносим новые теги в таблицу тегов и выбираем id уже существующих, после чего добавляем все это в таблицу привязки тегов.

    Выбор по тегу соответственно будет в разы быстрее (...WHERE tag_id IN(...))

    Общий принцип, так сказать))))
     
  5. askarbin

    askarbin

    Регистр.:
    31 мар 2009
    Сообщения:
    292
    Симпатии:
    36
    Рекомендую использовать второй вариант, т.к. он более практичен и возможно в будующем захотите навесить, допустим, похожие теги или что то подобное, будет возможность это сделать без особых проблем.
     
  6. sorcer

    sorcer Создатель

    Регистр.:
    21 фев 2009
    Сообщения:
    35
    Симпатии:
    4
    а у меня такой вопрос, как будет нагружать базу частые запросы к тегам, например "Облако тэгов" имея 100тыс.(или лучше делать запрос раз в сутки кроном, и сохранять его) и более записей в таблице. (и хранить их в отдельной таблице или можно и в общей с текстами, делая при запросе - SELECT tags FROM...) ?
     
  7. askarbin

    askarbin

    Регистр.:
    31 мар 2009
    Сообщения:
    292
    Симпатии:
    36
    При грамотной индексации нагрузка будет не столь ощутима. Если присутствует система кэширования - то вообще ничего не заметите (по моему это удобнее и рациональнее крона).
    А по поводу хранения в общей таблице - это неудобно и нелогично. Оптимальный вариант хранить теги в отдельной таблице и я уже писал почему.
     
  8. Sochniy

    Sochniy Постоялец

    Регистр.:
    1 май 2009
    Сообщения:
    84
    Симпатии:
    6
    вот дошли руки до дела. и понеслось, нубский вопрос номер раз:
    PHP:
    // теги вводились в поле tag. обрезаем пробелы и запятули
    $tags explode(','$tag);
    //удаляем лишние пробелы
    for ($i 0$i count($tags); $i++) {
    $tags[$i] = trim($tags[$i]);}
     
    //Выполняем запрос на добавление в базу данных
      
    $q4=mysql_query("INSERT INTO tags (tag) VALUES ('$tags[$i]')");
    $tags_id mysql_insert_id();
      if (
    $q4){ echo 'все хокей'; }
        else {echo 
    'Чото с тегами не то. Жопа какая-то ';}
    и вот все время жопа выскакивает. Что не так?
     
  9. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    1) для перечисления всех элементов массива лучше использовать цикл foreach;
    2) если уж взялись делать через цикл for, не делайте так "for ($i = 0; $i < count($tags); $i++)" никогда. В цикле при каждой итерации будет вызываться функция count, что замедляет работу скрипта. Достаточно 1 раз получить кол-во элементов в массиве и запомнить его в переменной;
    3) При запросе в БД вы хотите записать $tags[$i], хотя сам запрос выполнен вне цикла и вернет пустоту, т.к. вне цикла $tags[$i] не существует;

    Навскидку набросал более грамотный код:

    PHP:
    $tags explode(','$tag);
    foreach (
    $tags as $tag)
    {
      
    $tag trim($tag);
      
    $q4 mysql_query("INSERT INTO `tags` (`tag`) VALUES ('".$tag."')");
    $tags_id mysql_insert_id();
     if (
    $q4) echo 'все хокей'
     else echo 
    'Чото с тегами не то. Жопа какая-то ';
    }
     
    Sochniy нравится это.
  10. Sochniy

    Sochniy Постоялец

    Регистр.:
    1 май 2009
    Сообщения:
    84
    Симпатии:
    6
    saen, спасибо большое, я на 2 шага приблизился к истине. Но с вашим запросом мне выдает теперь:
    количество ошибок=количеству тегов. Снес иф-элс под цикл, но как не трудно догадаться все равно "жопу" выдает.

    Может еще какие нюансы есть?
     
Статус темы:
Закрыта.