Bonsoir,
Je suis en train de créer un système de topic lu / non lu.
Je m'explique :
J'ai une liste de topics, j'aimerais que quand les utilisateurs A, B et C clique sur un sujet, le sujet deviennent "lu" pour eux, ce qui fait que si un nouvel utilisateur arrive (D.. par exemple) le sujet sera "non lu" pour lui.
La question est : comment organiser la bdd et le code pour que ça fonctionne.
J'ai essayé sans que ça ne fonctionne réellement :
En faite ce que je fais c'est qu'à chaque fois qu'un utilisateur clique sur un sujet j'ajoute une ligne en bdd contenant le pseudo de l'utilisateur l'id de l'article et la catégorie (ce qui me permet par la suite de sélectionner le sujet pour l'afficher comme "lu").
Et c'est là que le problème se pose, j'ai mon sujet dans la table des sujets "lu", mais aussi dans celle des "non lu", ce qui au moment de la sélection pose problème : Je me retrouve avec deux sujets identique mais un est "lu" et l'autre ne l'est pas (et je ne veux pas supprimer les sujets de la table "non lu".. étant ma table principal pour les articles et qu'elle me sert dans un autre module ce n'est absolument pas ce que je veux).
EDIT, peut être avec des cookies ?
Bonjour,
Je verrai la chose de cette façon :
Une table permettant de savoir si une personne a lu le sujet ( id - id_sujet - id_utilisateur - lu )
Quand l'utilisateur viens sur un sujet, il suffit d'insérer une ligne dans la table afin de dire que l'utilisateur à lu cette news
Lors de l'affichage des news, une recherche dans cette table avec l'id du sujet et l'id de l'utilisateur. Si nous avons une entrée alors le sujet est lu sinon le sujet n'est pas lu.
pour mon forum j'ai fait ça !!!!
if(isset($_SESSION['auth']) && !empty($_SESSION['auth'])){
$id = intval($_SESSION['auth']->id);
$get = intval($_GET['id']);
$views = $db->prepare("
SELECT
f_message_view.id AS viewid,
f_message_view.topic_id,
f_message_view.user_id,
f_message_view.last,
f_topics.id
FROM f_message_view
LEFT JOIN f_topics ON f_message_view.topic_id = f_topics.id
WHERE f_message_view.user_id = ? AND topic_id = ?
");
$views->execute([$id,$get]);
$view = $views->fetch();
if(
isset($view->topic_id) && !empty($view->topic_id == $get)
&&
isset($view->user_id) && !empty($view->user_id == $id)
){
$u = [$id,$get];
$sql = $db->prepare("UPDATE f_message_view SET last = NOW() WHERE user_id = ? AND topic_id = ? ")->execute($u);
}else{
$i = [$get,$id];
$sql = $db->prepare("INSERT f_message_view SET topic_id = ?, user_id = ?, last = NOW()")->execute($i);
}
}
Avec une table séparé.
j'imagine qu'il ya mieux mais pour l'instant ça fonctionne pour moi !!! biensur pour ne pas surcharger la bdd je n'enregistre que les user en session qui passe par viewtopic.
la je fait un insert si je n'est jamai lu et je fait aussi un update si jamai il y a une réponse.
@Pierrot01, la colonne id n'est pas obligatoire, car la clé primaire sera formée par les deux clés id_sujet et id_utilisateur, ca permettra de sauver quelques octets en base de données ;)
Bonjour,
Déjà merci pour vos réponses,
"Une recherche dans cette table avec l'ID du sujet de l'utilisateur."
Sauf que je ne connais pas l'id du sujet. Je ne peux pas faire de recherche dessus car mon affichage lu non lu se trouve dans une page où il y a tous les sujets en lien avec la catégorie il est donc un peu compliqué de faire une recherche avec une donnée inconnu.
Quand vous affichez la liste des sujets, il y a bien un lien "lire la suite" avec l'id du sujet ?
Non pas vraiment, il suffit juste de cliquer sur la div du sujet pour lire la suite.
Et le problème c'est que l'ID se trouve uniquement sur cette div. La requête ne pourra pas donc exploiter l'ID (le but étant d'avoir un code organisé)
Lorque vous listez vos sujets, il faut aussi à chaque fois faire une requête afin de vérifier si le sujet a été lu par l'utilisateur.
Qu'elle est le code que vous avez pour lister vos sujets ?
select id,subject,content,(select count(id) from table_lu where id_sujet=post.id and id_utilisateur=$utilisteurencours ) as lu from post
J'utilise trois requêtes différente :
// Cette requête récupère les articles "Épinglé", cette partie fonctionne bien.
$req_article_pinned = $cnx->prepare('
SELECT distinct * FROM articles
WHERE tag = :tag AND topic_pinned = :topic_pinned AND topic_icon = :topic_icon
ORDER BY id DESC');
$req_article_pinned->execute(['tag' => $data['tag'], 'topic_pinned' => 1, 'topic_icon' => "bell-o"]);
// Cette requête récupère les articles "normaux", les articles "Non lu".
$req_article = $cnx->prepare('
SELECT distinct * FROM articles
WHERE tag = :tag AND topic_pinned = :topic_pinned
ORDER BY id DESC');
$req_article->execute(['tag' => $data['tag'], 'topic_pinned' => 0]);
// Cette requête récupère les articles Lu.
$req_article_readed = $cnx->prepare('SELECT * FROM topic_readed
WHERE tag = :tag AND readed_by = :readed_by
ORDER BY id DESC');
$req_article_readed->execute(['tag' => $data['tag'], 'readed_by' => $auth['username']]);
Au début mon idée était d'utiliser des jointures, pour chacune de ces requêtes j'utilise un foreach, qui s'appliquer sur une div pour chaque bloc de sujet :
Une div qui où sont affiché les sujets "épinglé" etc...
Bah déjà tu met deux requêtes dans une, et j'aurais besoin que tu expliques ta requête.
select id,subject,content,(select count(id) from table_lu where id_sujet=post.id and id_utilisateur=$utilisteurencours ) as lu from post
je pars du principe précédement expliqué.
si lu = 1 le sujet à été lu
@plus
Pierre
Sauf que le problème que j'ai avec l'idée de Carouge, c'est qu'une fois que le sujet "Lu" est envoyé dans la table, ce même sujet se trouve dans la table des sujets "basique" (j'entend ici, les sujets non lu..), et donc il y a doublons. Ce que je dis dans mon premier post, c'est que je ne peux pas supprimer de la table "principal" (la table où sont envoyé mes articles au tout début..) des articles le sujet en question. J'en ai besoin pour un autre module..
Pour ce que je vais dire ensuite et pour que ce soit le plus compréhensible pour vous je vais vous décrire mon architecture :
J'ai trois div, une pour chaque type de sujets (Lu, non lu et épinglé), ce qui fait qu'à chaque changement de "statue" (donc non lu vers lu.. ou non lu vers épinglé) je change le sujet de div pour que ça ait une cohérence.
Ma question est donc : Comment faire en sorte qu'un sujet passe de non lu à lu sans que celui-ci soit supprimé de la table d'origine ? (En gros éviter les doublons lors de l'affichage).
tu parles de div (element d'interfave html) de table de base de données.
je crois que tu mélanges un peu tout :D
Comme te le conseillais Carouge10, tu créés une autre table sujet_lu avec id,id_util,id_subject
des que le sujet est lu, tu insere un enreg dans cette table.
dans ce cas, le type de requete que j'ai fais devrais fonctionner.
Je vois pas pourquoi plusieurs requetes.
@plus.
Pierre
Je ne mélange rien, par contre as-tu bien lu mes précédemment posts ? Ce que je ne souhaite pas c'est de voir dans mes divs des doublons. Deux fois le même sujets mais sous un "statue" différent, Lu et non lu. Et c'est ce que j'explique dans mon premier post et également dans le post précédent ta réponse.
Je ne comprend pas ce que tu fais :D
c'est certainement trop compliqué pour moi :D
@plus
Pierre