我試圖爲我的漫畫網站實現標記系統。PHP標記系統 - 遇到SESSION問題
目標與SO-類似,用戶可以點擊多個標籤,並且這些標籤與它們保持一致 - 主要的區別在於我使用$ _SESSION存儲它們,而不是它所具有的登錄系統。
一旦用戶點擊一個標籤,它會限制顯示那些符合標籤ID的漫畫。有人建議我有3個獨立的表格 - 一個用於漫畫,一個用於標籤,以及一個關係表ComicTags。漫畫可以有0個或多個標籤,並且一個標籤可以與1個或多個漫畫相關聯。
我掙扎寫正確的SQL查詢,將有0或多個標籤ID連接漫畫ID。
請問我的表建立這樣的嗎?
會我的查詢中檢索這些是這樣嗎?
$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 ...
編輯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();
?>
你不分組聚合函數,所以你失去所有,但由DB找到的第一個標籤。 – 2013-02-25 14:55:20
我認爲你應該看看使用持久cookie,而不是會話,來存儲這個用戶標籤選擇數據。這樣當用戶回來幾天/幾周/幾個月後,在同一瀏覽器上,他們的標籤仍然可用。會議(並應該)在短時間內不活動後清理。 – leftclickben 2013-02-25 15:02:22
@leftclickben好吧,我不知道如何實現。你知道的任何好資源? – Growler 2013-02-25 15:04:07