2 votes

PHP Tagging System - problème avec SESSION

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 ?

enter image description here

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...

enter image description here


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

1voto

Michael Berkowski Points 137903

Vous devez adhérer à travers les comicstags à la table tags afin d'obtenir le TagName . Ajoutez-en donc un de plus 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

En GROUP BY a été supprimée car vous n'utilisez pas d'agrégats ( COUNT(), SUM(), MIN(), MAX() etc). Si vous ne voulez que des lignes uniques, ajoutez DISTINCT dans le SELECT .

1voto

Hackerman Points 10570

Utilisez cette :

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

J'espère que cela vous aidera.

Saludos ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X