PHP标记系统 - SESSION的麻烦

时间:2013-02-25 14:49:23

标签: php mysql

我正在尝试为漫画网站实施标记系统。

目标类似于SO-用户可以点击多个标签,这些标签与它们保持一致 - 主要区别在于我使用$ _SESSION存储它们,而不是SO拥有的登录系统。 / p>

用户点击代码后,会将显示的漫画限制为与代码ID匹配的漫画。有人建议我有3个单独的表 - 一个用于漫画,一个用于标签,一个关系表ComicTags。漫画可以有0个或多个标签,标签可以与1个或多个漫画相关联。

我正在努力编写正确的sql查询,该查询会将漫画ID与0或多个标记ID相关联。

我的表格会这样设置吗?

enter image description here

我的查询是否会像这样撤回?

$result = $mysqli->query("SELECT * FROM comics c INNER JOIN comictags ct ON (c.id = ct.comicID) WHERE ct.tagID IN (1, 2, 3) GROUP BY c.id");

谢谢!


修改

我是否正确地将其可视化?

1)首先从漫画和标签中选择所有列......

2)将漫画ID加入他们在漫画表中匹配的ID

3)将标记ID加入他们在ComicTags表中的匹配ID

4)在这种情况下,只选择那些WHERE标签id为1或2 ......这样就会返回所有漫画ID ......

enter image description here


编辑2:代码

<?php 
session_start();
include 'dbconnect.php';

$site = (isset($_GET['site']) ? ($_GET['site']) : "comics");
$tag = $_GET['_tagChoice'];

if (!isset($_SESSION['tags'])) {
  $_SESSION['tags'] = array();
}

$tag = $mysqli->real_escape_string($tag);

$_SESSION['tags'][] = $tag;


    foreach ($_SESSION['tags'] as $tag) {

        echo $tag;
    }

$_SESSION['tags'] = array_unique($_SESSION['tags']);

$result = $mysqli->query(
    "SELECT c.*, t.*
    FROM comics c 
    LEFT JOIN comictags ct ON (c.id = ct.comicID) 
    LEFT JOIN tags t ON (t.id = ct.tagID)
    WHERE ct.tagname IN (" . implode(',', $_SESSION['tags']). ")
    OR ct.tagname IS NULL");

 mysqli_close($mysqli);

     while ($row = $result->fetch_assoc()) {        
        echo $row['comic_id'];
    }

//session_destroy();
?>

2 个答案:

答案 0 :(得分:1)

您需要将通过 comicstags表加入tags表,以获取TagName。所以再添加一个INNER JOIN

SELECT 
 /* Selecting all columns from comics and tags, not from comicstags */
 c.*,
 t.*
FROM 
  comics c
  /* First join matches comics to comicstags */
  INNER JOIN comictags ct ON (c.id = ct.comicID)
  /* Second join pairs comicstags to tags */
  INNER JOIN tags t ON (t.TagID = ct.TagID)
WHERE 
   ct.tagID IN (1, 2, 3)     
   /* Or those which have no tags */
   OR ct.tagID IS NULL

由于您未使用聚合(GROUP BY等),COUNT(), SUM(), MIN(), MAX()已被删除。如果您只想要唯一的行,请将DISTINCT添加到SELECT

答案 1 :(得分:1)

使用此:

select t.TagId,t.TagNamem,cs.Path from Tag t
inner join ComicTag ct
on(t.TagId =ct.TagId)
inner join Comics cs
on(ct.ComicID = cs.Comic_id)
where t.TagId = $tag_cliked

我希望这会有所帮助。

Saludos;)