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

Статус
В этой теме нельзя размещать новые ответы.

Sochniy

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

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

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

Добавлено через 14 минут
полистал форум, нашел хорошую статью:

Сейчас изучаю и буду пробовать.

Подскажите как реализовать следующее:
юзер вводит в строку поиска пару слов (или словосочетаний), разделяя их запятой, а ему выводятся записи, содержащие эти теги (равные словам, которые он ввел).
Как разбивать запрос на отдельные составляющие и как производить поиск?
 
Разбить запрос можно через explode.
Например -
PHP:
$tags  = "one,two";
$explode = explode(",", $tags);
echo $explode[0]; // one
echo $explode[1]; // two
 
спасибо, с этим, а также с убиранием пробелов я уже разобрался. Сейчас нужна помощь именно в обращении к базе.
 
Ну собственно 2 варианта, которые сразу в голову лезут:

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

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

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

Общий принцип, так сказать))))
 
Рекомендую использовать второй вариант, т.к. он более практичен и возможно в будующем захотите навесить, допустим, похожие теги или что то подобное, будет возможность это сделать без особых проблем.
 
а у меня такой вопрос, как будет нагружать базу частые запросы к тегам, например "Облако тэгов" имея 100тыс.(или лучше делать запрос раз в сутки кроном, и сохранять его) и более записей в таблице. (и хранить их в отдельной таблице или можно и в общей с текстами, делая при запросе - SELECT tags FROM...) ?
 
При грамотной индексации нагрузка будет не столь ощутима. Если присутствует система кэширования - то вообще ничего не заметите (по моему это удобнее и рациональнее крона).
А по поводу хранения в общей таблице - это неудобно и нелогично. Оптимальный вариант хранить теги в отдельной таблице и я уже писал почему.
 
вот дошли руки до дела. и понеслось, нубский вопрос номер раз:
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 'Чото с тегами не то. Жопа какая-то ';}
и вот все время жопа выскакивает. Что не так?
 
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 'Чото с тегами не то. Жопа какая-то ';
}
 
saen, спасибо большое, я на 2 шага приблизился к истине. Но с вашим запросом мне выдает теперь:
Чото с тегами не то. Жопа какая-то Чото с тегами не то. Жопа какая-то Чото с тегами не то. Жопа какая-то
количество ошибок=количеству тегов. Снес иф-элс под цикл, но как не трудно догадаться все равно "жопу" выдает.

Может еще какие нюансы есть?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху