2011-12-20 2 views
0

Chaque fois qu'un utilisateur lit un message, il affecte un cookie, par ex.Recherche de messages non lus dans une base de données

set_cookies($id,'read',60*60*24); 

Mais le problème est de savoir comment sélectionner tous les messages qui n'ont pas été lus par l'utilisateur?

SELECT * from posts where (post is unread) 

Il ne nécessite pas de connexion. Structure de la table:

ID | Content | Category 
+0

Veuillez nous donner quelques détails sur la structure de la table. –

+0

mis à jour le mate :) – Michelle

+0

qu'est-ce que vous mettez exactement dans cookie? PostID? –

Répondre

2

Avec votre solution, vous feriez quelque chose comme ceci:

$ids = array(); 
if (isset($_COOKIES)) { 
    foreach ($_COOKIES as $cookie => $value) { 
     if (is_numeric($cookie) && $value == 'read') { 
      $ids[] = $cookie; 
     } 
    } 
} 

if (isset($ids[0])) { 
    $posts = implode(',',$ids); 
    $query = "SELECT * from posts where id in ({$posts})"; 
    // Do the query 
} else { 
    // no read posts. 
} 

Mais vous devriez vraiment regarder dans le stockage différemment vos variables de lecture.

0

Si vous pouvez créer une liste des ids qui ont été lus, oui:

SELECT * 
FROM posts 
WHERE ID NOT IN ($list_of_post_ids_that_have_been_read) 
1

Je suppose ici que lorsque l'utilisateur lit un message l'identifiant de la lecture post est stocké quelque part. Nous allons pour le moment supposer qu'il est dans le tableau read_posts qui a un format:

UID | ID 

Dans ce cas, votre requête devient:

SELECT * FROM posts WHERE ID NOT IN (SELECT id FROM read_posts WHERE uid = <user's id>); 

Si vous accueillez seulement la lecture des données de façon séquentielle et stocker dans la même table la requête devient encore plus simple:

SELECT p.* FROM posts p, read_posts rp WHERE p.ID > rp.ID AND rp.UID = <user id>; 

La syntaxe de cette requête peut varier légèrement, mais l'idée générale est claire selon moi.

Questions connexes