Jump to content
  • 0

Система тегов для сайта с поиском


Torawhite
 Share

Question

Здравствуйте! Интересует вопрос создания системы тегов для статей на php. Погуглил и пришёл к выводу, что помимо таблицы со статьями, необходимо создать таблицу с тегами и таблицу связей тег-статья - классическая схема. Но мне не совсем понятен алгоритм вывода тегов. У меня на сайте статья выводятся блоками циклом

do {printf()} while (что-то попадает в массив)

То есть мне нужно запустить ещё один цикл внутри printf()?

 Не совсем понимаю алгоритм вывода и сам код. + поиск. У меня реализован поиск с помощью оператора Like. А как реализуется поиск по конкретному тегу. Мы на него кликаем, а ссылка ведёт на обработчик и передаёт переменную с названием тега в адресной строке? Не совсем понимаю алгоритм работы с тремя таблицами. Разъясните, пожалуйста, если у кого-то есть терпение!)

 

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0
Мы на него кликаем, а ссылка ведёт на обработчик и передаёт переменную с названием тега в адресной строке?

в общем то да, так и есть.

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

когда в урл попадает тег-ключевик, то на странице этого урл-а составляем запрос к бд: if(!empty($_GET['tag'])) { SELECT * FROM `pages` WHERE `meta_k` LIKE '%".$_GET['tag']."%' }

ну типа того в общем...

Link to comment
Share on other sites

  • 0

 

Мы на него кликаем, а ссылка ведёт на обработчик и передаёт переменную с названием тега в адресной строке?

в общем то да, так и есть.

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

когда в урл попадает тег-ключевик, то на странице этого урл-а составляем запрос к бд: if(!empty($_GET['tag'])) { SELECT * FROM `pages` WHERE `meta_k` LIKE '%".$_GET['tag']."%' }

ну типа того в общем...

 

Этот метод мне понятен, но  там нужно будет применять explode() и убивать запятые. Я хотел так делать, но, почитав форумы, люди пишут, что классика и наиболее оптимальный вариант - реализация с помощью трёх таблиц.

То есть: таблица статей с полями id, title,text и прочее; таблица тегов с полями id и name; и таблица где мы сводим id статьи с id тега - tag_id и article_id. Но я не могу понять, как в таком случае формировать запрос к базе. Тем более, что у одной статьи может быть несколько тегов. А у меня ещё и три таблицы со статьями(((

Как формировать такой запрос я так и не нашёл, вот и прошу помочь. Простой-то запрос я сформировать могу, например к таблице со сведением ag_id и article_id, но там только цифры. Тут как-то двумя запросами делать нужно что ли... :unsure:

Link to comment
Share on other sites

  • 0

explode делать не нужно, ведь вы ищите с помощью оператора LIKE, для этого нужно просто сделать поле с тегами index, для поиска по ней.

ну а если несколько таблиц и организовать связь по id, то можно и вот так скажем:

$query = mysql_query("SELECT * FROM `table_article` as A, `table_tag` as B WHERE A.id = B.id AND B.name = '".$_GET['tag']."' ORDER by B.id DESC");

можно еще и join-ом попробовать, может побыстрее будет...

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

Link to comment
Share on other sites

  • 0

explode делать не нужно, ведь вы ищите с помощью оператора LIKE, для этого нужно просто сделать поле с тегами index, для поиска по ней.

ну а если несколько таблиц и организовать связь по id, то можно и вот так скажем:

$query = mysql_query("SELECT * FROM `table_article` as A, `table_tag` as B WHERE A.id = B.id AND B.name = '".$_GET['tag']."' ORDER by B.id DESC");

можно еще и join-ом попробовать, может побыстрее будет...

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

Вот это запрос! А про explode написал так как мне нужно ещё каждое слово выводить в теге <a>. Я тут подумал, а зачем все эти танцы с бубном! Можно создать отдельный столбец в таблице со статьями, скажем tags и запихивать туда теги в теге <a>, например, <a href="/tag_search_view.php?query=Some_tag" class="tag_link">Some_tag</a> за ним следующий и так далее. Будет много статей и упадёт скорость поиска, тогда можно Sphinx прикрутить. Тогда никакого дополнительного цикла не нежно, таблиц и сложных запросов. Или это совсем будет моветон?

Link to comment
Share on other sites

  • 0
Или это совсем будет моветон?

не то что моветон, но вы же вот сами пришли почти к моему решению:

Я тут подумал, а зачем все эти танцы с бубном! Можно создать отдельный столбец в таблице со статьями, скажем tags и запихивать туда теги в теге , например, Some_tag за ним следующий и так далее.

только не нужно в тегах пихать, а explode работает очень шустро, просто для этого поля сделайте индекс и все.

а сфинкс сюда еще прикручивать это как стрелять из пушки по воробьям. :)

Link to comment
Share on other sites

  • 0

 

Или это совсем будет моветон?

не то что моветон, но вы же вот сами пришли почти к моему решению:

 

 

Я тут подумал, а зачем все эти танцы с бубном! Можно создать отдельный столбец в таблице со статьями, скажем tags и запихивать туда теги в теге , например, Some_tag за ним следующий и так далее.

только не нужно в тегах пихать, а explode работает очень шустро, просто для этого поля сделайте индекс и все.

а сфинкс сюда еще прикручивать это как стрелять из пушки по воробьям. :)

 

Спасибо! Буду пробовать!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy