2016-06-25 1 views
0

Я показываю статус сообщения, который отличается от каждого пользователя. Скажем, user1 отправляет сообщение в user2, user1, а затем устанавливает значение read, а сообщение user2 - unread. Он будет обновлен после того, как user2 нажмет сообщение.Отображение состояния сообщения: чтение и непрочитанное (отличается от других пользователей) в системе обмена сообщениями PHP/MySQL

Таким образом, в этих сценарии, сообщение user1 (от почтового ящика) будет иметь серый цвета шрифта, который указывает, что сообщение устанавливается на readuser1 это тот, кто посылает). С другой стороны, user2 имеют жирный шрифт, который указывает, что сообщение unread.

Вот первая структура таблицы:

message(messageid, fromid, toid, message, timestamp, status) 

Проблема здесь состоит в том, что если я обновлю статус сообщения на read, она влияет на другую сторону (user2). Так что я добавить еще один столбец, который будет установлен статус отличается от user1 и user2:

message(messageid, fromid, toid, message, timestamp, from_status, to_status) 

Здесь from_status является для fromid и to_status для toid. Но у меня возникла проблема с тем, как использовать эти значения для отображения состояния.

РНР код, который я использую во время моей первой попытки этот:

<?php 
$id = $_SESSION['id']; 
$query = mysql_query("SELECT m.* FROM message m 
            LEFT JOIN message m2 ON (
            (m.fromid=m2.fromid AND m.toid=m2.toid) OR 
            (m.fromid=m2.toid AND m.toid=m2.fromid) 
           ) AND m.timestamp<m2.timestamp 
            WHERE (m.fromid='$id' OR m.toid='$id') AND m2.toid IS NULL ORDER BY timestamp DESC"); 

while ($message = mysql_fetch_array($query)) { 
    if ($message['status'] === 'unread') { 
    // bold font style will be applied 
    } 
    else { 
    // gray-colored font will be applied 
    } 
} 
?> 

(Запрос выбирает каждый разговор с каждого пользователя с последней беседой.)

Этого кода работает отлично для главный пользователь, который равен user1, но влияет на другую сторону, которая считает, что сообщение, полученное от user2, установлено на read или unread.

Итак, у меня возникли проблемы с тем, что делать с измененной таблицей, каждая из которых имеет 2 отдельных status для каждого пользователя. Как я могу это сделать?

+0

Есть ли возможность повторно установить статус на непрочитанный? Потому что в противном случае вы можете просто предположить, что если человек, смотрящий на сообщение, является отправителем, он будет прочитан и будет иметь одно поле статуса, которое отслеживает, прочитал ли его получатель. – andrewsi

+0

Для немного лучшего решения переименуйте поля в 'sender_status' и' recipient_status', поэтому ясно, что именно, и просто обновите соответствующий, в зависимости от того, кто сейчас читает сообщение. – andrewsi

+1

Для более элегантного решения измените чтобы появилась новая таблица для получателей сообщений с такими полями, как «usedID», «status» и «role», где роль «отправитель» или «получатель». Это позволит вам отправлять одно и то же сообщение нескольким людям и отслеживать каждый из их статусов индивидуально. – andrewsi

ответ

2

комментарий @andrewsi довольно приятный, когда у вас будет, например, много приемников. В вашем случае это только одно дополнительное поле, поэтому, на мой взгляд, это не переполнение, чтобы использовать только одну таблицу. Что касается вашего дела вы можете сделать это в одной простой SQL:

SELECT m.*, 
    CASE 
     WHEN m.fromid = $id THEN m.from_status 
     WHEN m.toid = $id THEN m.to_status 
    END as read_status 
FROM message m 
WHERE 
    m.fromid = $id OR m.toid = $id 
ORDER BY timestamp DESC; 

А по вашему мнению, вы только проверяете read_status полю

+0

Я сейчас понимаю это. Я протестировал запрос и дал мне статус сообщения. Все, что мне нужно, это реализовать его. Благодарю. –

+0

Пожалуйста, отметьте это как ответ, если это помогло, спасибо! –

+0

Сначала я его реализую, и я помечаю его, как только я заставлю его работать. Вы имеете мое слово. Не возражаете ли вы выдвинуть мой вопрос, чтобы он мог связаться с другими программистами, которые могут столкнуться с той же проблемой, что и мои? Это будет большой помощью. :) –

0

(Опубликовано от имени ОП.)

Мне удалось решить проблему, благодаря @ Rafal Mnich. Поэтому я беру часть его запроса и делаю небольшую модификацию, и он работает.

Вот запрос:

SELECT m.msgid, m.fromid, m.toid, m.content, 
    CASE 
    WHEN m.fromid = '$id' THEN m.frommsgstatus 
    WHEN m.toid = '$id' THEN m.tomsgstatus 
    END AS msgstatus 
FROM msg m 
    LEFT JOIN msg m2 
    ON ((m.fromid=m2.fromid AND m.toid=m2.toid) OR (m.fromid=m2.toid AND m.toid=m2.fromid)) AND m.timestamp<m2.timestamp 
WHERE (m.fromid='$id' OR m.toid='$id') AND m2.toid IS NULL 
ORDER BY m.timestamp DESC 

Эти сообщения отображаются сгруппированных отправителем fromid, который также отображает последнюю беседу, вы должны от каждого из отправителей. И он отображает правильное состояние сообщения на обеих сторонах пользователей.

+0

Но зачем вам это левое присоединиться? –

+0

Привет @ RafałMnich, вам нужно будет опубликовать это под вопросом после его разблокировки - я отправил это от имени OP, взяв текст из решения, прилагаемого к вопросу. – halfer

+0

@ RafałMnich: вопрос теперь разблокирован, поэтому вы можете опубликовать его под вопросом, если хотите. – halfer

Смежные вопросы