Здраствуйте. Очень нужна помощь. Не знаю как это реализовать. Есть три таблицы: 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): else if ($Page == 'tag') { $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `tag` FROM `tags` WHERE `tag` = '$Module'")); if ($Row['tag']) include('module/posts/tag.php'); } Получается такая ссылка: http://localhost/tag(page)/tag1(module). Но возможно ли так сделать сами страницы с постами? Нужно что-то похожее на реализацию http://appleinsider.ru. Очень нужна помощь, так как слишком мало опыта в php. Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
в .htaccess Код (PHP): RewriteEngine On RewriteRule ^([^.]+)$ index.php потом уже пиши свой router Все что тебе нужно будет в REQUEST_URI По простом, explode($_SERVER('REQUEST_URI')); получишь массив с составляющими URI по ним уже дергаешь нужный пост
Код (PHP): $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $URL_Parts = explode('/', trim($URL_Path, ' /')); $Page = array_shift($URL_Parts); $Module = array_shift($URL_Parts); С этим проблем нет, основных вопроса всего два: 1.Как подставить в ссылку на пост первый тег, к которому принадлежит пост: http://site.com/tag1/12345 2.Как вывести на странице http://site.com/tag1 все записи, у которых есть tag1 Все это используя таблицы:
1. я не понял, как ты получил пост не зная тега? 2. Код (PHP): "select from posts_tags where taid = 'tag1';"; этим запросом получишь все идентификаторы постов относяшиеся к тегу tag1 потом уже дергай каждый пост по его ид.
Спасибо) 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, а уже потом вытянуть посты.
значит по миени тега получаешь его ид, потом по ид тега получаешь все его посты. Добавлено спустя 8 минут 17 секунд: Если в tag хранится имя тега, то так можно получить id: Код (PHP): "select from tags where tag = 'tag1';"; получи id всех постов которые к нему относятся: Код (PHP): "select from posts_tags where taid = 'tag1';"; потом уже имея ид постов, получи сами посты через цикл. Запрос выглядит так: Код (PHP): "select from posts where id = 'post_id';"; Добавлено спустя 2 минуты 36 секунд: подставить в чем проблема? Как обычно подставь. Главное получи. Добавлено спустя 3 минуты 57 секунд: Мне кажется или переделать надо базу? Если было еще одно поле post_id в posts то сразу одним запросом можно было бы получить все записи относящиеся к определенному tag
Никак не могу найти ошибку: 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
Виктор К., оформи код как надо. Трудно читать. Добавлено спустя 1 минуту 3 секунды: выложи структуру всех таблиц Добавлено спустя 42 секунды: вот, удобная штука http://sqlfiddle.com/
Код (Text): else if ($Page == 'tag') { $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `tag`, `tagid` FROM `tags` WHERE `alias` = '$Module'")); if ($Row['tag']) include('module/posts/tag.php'); else if ($Row['tag'] and $Module == 'id') include('module/posts/material.php')}; Код (Text): $postid = 'SELECT `postid` FROM `posts_tags` WHERE `taid` = '.$Row[tagid].''; Код (Text): $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 секунд:
Это не структура таблиц, не то что я просил. Попробуй воссоздать это все на sqlfiddle Ты отладку делаешь данных которые получаешь из бД? Если да, то покажи как делаешь, какой дамп. Добавлено спустя 11 минут 27 секунд: Виктор К., выложи дамп от каждого запроса.
Спасибо, разобрался, забыл скобку Если кому нужно сделать что то подобное пишите, выложу и базу, и код.
Все получилось, но есть одна проблема: из 3 постов с тегом выводится один. Мне кажется проблема в этой строчке: Код (Text): $postid = 'SELECT `postid` FROM `posts_tags` WHERE `taid` = '.$Row[tagid].'';