2013-02-25 76 views
2

我試圖爲我的漫畫網站實現標記系統。PHP標記系統 - 遇到SESSION問題

目標與SO-類似,用戶可以點擊多個標籤,並且這些標籤與它們保持一致 - 主要的區別在於我使用$ _SESSION存儲它們,而不是它所具有的登錄系統。

一旦用戶點擊一個標籤,它會限制顯示那些符合標籤ID的漫畫。有人建議我有3個獨立的表格 - 一個用於漫畫,一個用於標籤,以及一個關係表ComicTags。漫畫可以有0個或多個標籤,並且一個標籤可以與1個或多個漫畫相關聯。

我掙扎寫正確的SQL查詢,將有0或多個標籤ID連接漫畫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在ComicTags表

3)加入標籤的ID與匹配ID在ComicTags表

4)在這種情況下,只選擇那些標籤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(); 
?> 
+1

你不分組聚合函數,所以你失去所有,但由DB找到的第一個標籤。 – 2013-02-25 14:55:20

+0

我認爲你應該看看使用持久cookie,而不是會話,來存儲這個用戶標籤選擇數據。這樣當用戶回來幾天/幾周/幾個月後,在同一瀏覽器上,他們的標籤仍然可用。會議(並應該)在短時間內不活動後清理。 – leftclickben 2013-02-25 15:02:22

+0

@leftclickben好吧,我不知道如何實現。你知道的任何好資源? – Growler 2013-02-25 15:04:07

回答

1

你需要加入通過comicstags表到tags表,以獲得TagName。因爲你沒有用骨料(COUNT(), SUM(), MIN(), MAX()等)

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取出:所以增加一個INNER JOIN。如果你想唯一行,添加DISTINCTSELECT

+0

謝謝,邁克爾!我上面做了一個編輯來繪製邏輯,以便我可以將它想象出來 - 請大家確認我的理解? – Growler 2013-02-25 17:14:22

+0

@Growler是的,你的圖精確映射關係。 – 2013-02-25 18:03:17

+0

好的,謝謝。我現在接受答案,但直到下班後我才能實施。我可能還有其他問題 – Growler 2013-02-25 18:06:53

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;)