За последние 24 часа нас посетили 15552 программиста и 1616 роботов. Сейчас ищут 798 программистов ...

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

Тема в разделе "PHP и базы данных", создана пользователем Виктор К., 1 апр 2016.

  1. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Здраствуйте. Очень нужна помощь. Не знаю как это реализовать.
    Есть три таблицы:
    1.tags. Состоит из tagid, tag, alias(назване латинскими символами в нижнем регистре для ссылок) и text
    2.posts. Состоит из id, name, text, date и так далее.
    3.posts_tags. Связная таблица, состоит из postid (=id из 2), taid (=tagid из 1).

    На сайте необходимо сделать ссылки вида: http://site.com/tag1/12345, где
    *tag1-название тега
    *12345-id поста

    То есть, по ссылке http://site.com/tag1 мы увидим страницу с описанием тега (text) и записями на сайте, к которым добавлен этот тег через связную таблицу.
    А по ссылке http://site.com/tag1/12345 выводится сам пост.

    На сайте реализовывал ссылки так:
    Код (PHP):
    1. else if ($Page == 'tag') {
    2.     $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `tag` FROM `tags` WHERE `tag` = '$Module'"));
    3. if ($Row['tag']) include('module/posts/tag.php');
    4. }
    Получается такая ссылка: http://localhost/tag(page)/tag1(module). Но возможно ли так сделать сами страницы с постами? Нужно что-то похожее на реализацию http://appleinsider.ru.
    Очень нужна помощь, так как слишком мало опыта в php.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    в .htaccess
    Код (PHP):
    1. RewriteEngine On
    2. RewriteRule ^([^.]+)$ index.php
    потом уже пиши свой router Все что тебе нужно будет в REQUEST_URI

    По простом, explode($_SERVER('REQUEST_URI'));
    получишь массив с составляющими URI
    по ним уже дергаешь нужный пост
     
  3. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Код (PHP):
    1. $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $URL_Parts = explode('/', trim($URL_Path, ' /'));
    3. $Page = array_shift($URL_Parts);
    4. $Module = array_shift($URL_Parts); 
    С этим проблем нет, основных вопроса всего два:
    1.Как подставить в ссылку на пост первый тег, к которому принадлежит пост: http://site.com/tag1/12345
    2.Как вывести на странице http://site.com/tag1 все записи, у которых есть tag1

    Все это используя таблицы:
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    1. я не понял, как ты получил пост не зная тега?

    2.
    Код (PHP):
    1. "select from  posts_tags where taid = 'tag1';"; 
    этим запросом получишь все идентификаторы постов относяшиеся к тегу tag1
    потом уже дергай каждый пост по его ид.
     
  5. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Спасибо)
    else if ($Row['tag'] and $Module == 'id') include('module/posts/material.php');
    Не знаю как подставить в ссылку в $Page (до $Module) первый `tag`, присвоенный посту через таблицу posts_tags (из первой строчки, где встретится id этого поста, вытянуть id тега и подставить имя тега из таблицы `tags`).

    И еще забыл сказать, tag1 - текстовое имя тега, а taid - число. Этого и не могу понять, как сначала найти в `tags` id тега по `tag` из $Page, потом найти в `posts_tags` все id постов, которые в одной строчке с таким id, а уже потом вытянуть посты.
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    значит по миени тега получаешь его ид, потом по ид тега получаешь все его посты.

    Добавлено спустя 8 минут 17 секунд:
    Если в tag хранится имя тега, то так можно получить id:
    Код (PHP):
    1. "select from  tags  where tag = 'tag1';"; 
    получи id всех постов которые к нему относятся:
    Код (PHP):
    1. "select from  posts_tags where taid = 'tag1';"; 
    потом уже имея ид постов, получи сами посты через цикл. Запрос выглядит так:
    Код (PHP):
    1. "select from  posts where id = 'post_id';"; 
    Добавлено спустя 2 минуты 36 секунд:
    подставить в чем проблема? Как обычно подставь. Главное получи.

    Добавлено спустя 3 минуты 57 секунд:
    Мне кажется или переделать надо базу? Если было еще одно поле post_id в posts то сразу одним запросом можно было бы получить все записи относящиеся к определенному tag
     
  7. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Спасибо за помощь
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Виктор К., получилось?
     
  9. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Никак не могу найти ошибку:
    1. else if ($Page == 'tag') {
    $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `tag`, `tagid` FROM `tags` WHERE `alias` = '$Module'"));

    2. $postid = 'SELECT `postid` FROM `posts_tags` WHERE `taid` = '.$Row[tagid].'';

    3. $Param1 = 'SELECT `id`, `alias`, `name`, `added`, `date`, `read`, `text`, `active` FROM `posts` WHERE `id` = '.$postid.' '.$Active.' ORDER BY `id` DESC LIMIT 0, 5';

    В пост_тагс id - taid
    В tags id - tagid
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Виктор К., оформи код как надо. Трудно читать.

    Добавлено спустя 1 минуту 3 секунды:
    выложи структуру всех таблиц

    Добавлено спустя 42 секунды:
    вот, удобная штука
    http://sqlfiddle.com/
     
  11. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Код (Text):
    1. else if ($Page == 'tag') {
    2.     $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `tag`, `tagid` FROM `tags` WHERE `alias` = '$Module'"));
    3. if ($Row['tag']) include('module/posts/tag.php');
    4. else if ($Row['tag'] and $Module == 'id') include('module/posts/material.php')};
    Код (Text):
    1. $postid = 'SELECT `postid` FROM `posts_tags` WHERE `taid` = '.$Row[tagid].'';
    Код (Text):
    1. $Param1 = 'SELECT `id`, `alias`, `name`, `added`, `date`, `read`, `text`, `active` FROM `posts` WHERE `id` = '.$postid.' '.$Active.' ORDER BY `id` DESC LIMIT 0, 5';
    Добавлено спустя 14 минут 13 секунд:
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это не структура таблиц, не то что я просил. Попробуй воссоздать это все на sqlfiddle
    Ты отладку делаешь данных которые получаешь из бД? Если да, то покажи как делаешь, какой дамп.

    Добавлено спустя 11 минут 27 секунд:
    Виктор К., выложи дамп от каждого запроса.
     
  13. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Спасибо, разобрался, забыл скобку:) Если кому нужно сделать что то подобное пишите, выложу и базу, и код.
     
  14. Виктор К.

    Виктор К. Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    139
    Симпатии:
    6
    Адрес:
    Украина
    Все получилось, но есть одна проблема: из 3 постов с тегом выводится один. Мне кажется проблема в этой строчке:
    Код (Text):
    1. $postid = 'SELECT `postid` FROM `posts_tags` WHERE `taid` = '.$Row[tagid].'';
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Виктор К., покажи как ты вытягиваешь их в php/