2016-06-25 1 views
0

각 사용자마다 다른 메시지 상태가 표시됩니다. user1user2으로 메시지를 보내면 user1의 메시지 상태는 read으로 설정되고 user2의 메시지는 기본적으로 unread으로 설정됩니다. user2 메시지를 클릭하면 업데이트됩니다.메시지 상태 표시 : PHP/MySQL 메시징 시스템의 읽기 및 읽지 않음 (다른 사용자와 다름)

그래서 이러한 시나리오에서, (받은 편지함에서) user1의 메시지는 (user1가 보내는 하나이기 때문에) 메시지가 read로 설정되어 있음을 나타냅니다 회색 색상의 글꼴을해야합니다. 다른면에서 user2은 메시지가 unread임을 나타내는 굵은 글꼴을 가지고 있습니다.

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

여기서 문제가 나는 read에게 메시지 상태를 갱신하는 경우, 그 다른 쪽 (user2)에 영향이다

여기 테이블의 첫 번째 구조이다. 여기

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

from_statusfromid위한 것이며 to_statustoid입니다 : 그래서 user1user2 다르게 상태를 설정합니다 다른 열을 추가합니다. 하지만이 값을 사용하여 상태를 표시하는 방법에 문제가 있습니다.

내가 처음으로 시도하는 동안 사용하는의 PHP 코드는 다음과 같습니다

<?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'과 같은 필드가있는 메시지 수신자를위한 새 테이블이 있습니다. 여기서 role은 'sender'또는 recipient '입니다. 그러면 여러 사람에게 동일한 메시지를 보내고 각 상태를 개별적으로 추적 할 수 있습니다. – andrewsi

답변

2

@andrewsi 의견은 예를 들어 많은 수신자가있을 때 매우 좋습니다. 귀하의 경우에는 추가 필드가 하나뿐이므로 제 생각에는 테이블 하나를 사용하는 것이 오버 플로우가 아닙니다. 당신은 단지 read_status 필드

+0

나는 이것들을 좀 이해하고있다. 쿼리를 테스트하고 메시지 상태를 알려줍니다. 필요한 것은 구현하는 것뿐입니다. 감사. –

+0

도와 주신다면 답장으로 표시해주십시오. 고마워요! –

+0

먼저 구현할 것이고 작동하게되면 표시 할 것입니다. 약속 할게. 내 질문에 너무 많은 질문을 던져서 내 문제와 마주 치는 다른 프로그래머에게 다가 갈 수 있을까? 그것은 큰 도움이 될 것입니다. :) –

0

(. 영업 이익 대신에 게시 됨)

을 확인하는

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; 

그리고보기에 : 귀하의 경우에 대해서는 당신은 하나의 간단한 SQL이 작업을 수행 할 수 있습니다

@Rafal Mnich 덕분에 문제를 해결할 수있었습니다. 그래서 나는 그의 쿼리의 일부를 가져 와서 약간의 수정을하고 작동합니다.또한 당신이 보낸 사람의 각각에서 가지고있는 최신 대화를 표시 보낸 사람 fromid,별로 그룹화

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 

이러한 디스플레이 메시지 :

다음은 쿼리입니다. 그리고 그것은 사용자의 양쪽에 정확한 메시지 상태를 표시합니다.

+0

하지만 왜이 왼쪽 가입이 필요합니까? –

+0

안녕하세요 @ RafałMnich, 자물쇠가 풀린 후 질문에 게시해야합니다 - 나는 OP 대신 텍스트를 찍은 OP 대신 이것을 게시했습니다. – halfer

+0

@ RafałMnich : 질문이 잠금 해제되었으므로 원하는 경우 질문 아래 게시 할 수 있습니다. – halfer

관련 문제