J'essaie de mettre en place un système d'étiquetage pour mon site de bandes dessinées.
L'objectif est similaire à celui de SO - un utilisateur peut cliquer sur plusieurs tags, et ces tags restent avec lui - la principale différence étant que j'utilise $_SESSION pour les stocker, et non un système de login comme SO.
Lorsqu'un utilisateur clique sur une étiquette, les bandes dessinées affichées sont limitées à celles qui correspondent à l'identifiant de l'étiquette. Il m'a été suggéré d'avoir trois tables distinctes - une pour les bandes dessinées, une pour les étiquettes et une table relationnelle ComicTags. Une bande dessinée peut avoir 0 ou plusieurs tags, et un tag peut être associé à 1 ou plusieurs bandes dessinées.
J'ai du mal à écrire la bonne requête SQL qui va relier un identifiant de bande dessinée à 0 ou plusieurs identifiants de tags.
Mes tables seraient-elles disposées de la sorte ?
Ma requête pour les récupérer serait-elle la suivante ?
$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");
Merci de votre attention !
EDIT
Est-ce que je visualise bien la situation ?
1) Sélectionnez d'abord toutes les colonnes des bandes dessinées et des étiquettes...
2) Joindre les identifiants des bandes dessinées aux identifiants correspondants dans la table ComicTags.
3) Joindre les identifiants des tags aux identifiants correspondants dans la table ComicTags
4) dans ce cas, SELECTIONNER uniquement les BD dont l'identifiant est 1 ou 2... Cela renverrait donc tous les ID des bandes dessinées...
EDIT 2 : Code
<?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();
?>