Поиск непрочитанных сообщений в базе данных - PullRequest
0 голосов
/ 21 декабря 2011

Каждый раз, когда пользователь читает сообщение, он назначает файл cookie, например.

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

Но проблема в том, как выбрать все сообщения, которые не были прочитаны пользователем?

SELECT * from posts where (post is unread)

Не требует входа. Структура таблицы:

ID | Content | Category

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

С вашим решением вы бы сделали что-то вроде этого:

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

Но вы действительно должны по-другому взглянуть на хранение переменных чтения.

1 голос
/ 21 декабря 2011

Я предполагаю, что когда пользователь читает сообщение, его идентификатор где-то хранится.Давайте пока предположим, что он находится в таблице read_posts, имеющей формат:

UID | ID 

. В этом случае ваш запрос становится:

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

Если вы разрешаете только чтение последовательнои сохраняя данные в одной таблице, запрос становится еще проще:

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

Синтаксис этого запроса может немного отличаться, но общая идея, я думаю, ясна.

0 голосов
/ 21 декабря 2011

Если вы можете создать список прочитанных идентификаторов, да:

SELECT * 
FROM posts 
WHERE ID NOT IN ($list_of_post_ids_that_have_been_read)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...