在 PHP/MySQL 消息系统中显示消息状态:已读和未读(与其他用户不同)
Displaying message status: read and unread (differs from other users) in PHP/MySQL messaging system
我正在显示与每个用户不同的消息状态。假设 user1
向 user2
发送消息,user1
的消息状态然后设置为 read
,而 user2
的消息设置为 unread
默认情况下。 user2
点击消息后将更新。
因此在这些情况下,user1
的消息(来自收件箱)将具有灰色字体,表示消息设置为 read
(因为 user1
是发送者)。另一方面,user2
有一个粗体字,表示消息是 unread
.
这里是table的第一个结构:
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 代码是这些:
<?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
.
所以,我在修改后的 table 上遇到了一些麻烦,每个用户都有 2 个单独的 status
。我怎样才能完成这些?
@andrewsi 评论非常好,例如,当您有很多接收者时。在你的情况下,它只是一个额外的字段,所以在我看来,只使用一个 table 并不是溢出。
关于你的情况,你可以在一个简单的 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 字段
(代表 OP 发布。)
感谢@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
分组的邮件,其中还显示您与每个发件人的最新对话。并在用户双方显示正确的消息状态。
我正在显示与每个用户不同的消息状态。假设 user1
向 user2
发送消息,user1
的消息状态然后设置为 read
,而 user2
的消息设置为 unread
默认情况下。 user2
点击消息后将更新。
因此在这些情况下,user1
的消息(来自收件箱)将具有灰色字体,表示消息设置为 read
(因为 user1
是发送者)。另一方面,user2
有一个粗体字,表示消息是 unread
.
这里是table的第一个结构:
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 代码是这些:
<?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
.
所以,我在修改后的 table 上遇到了一些麻烦,每个用户都有 2 个单独的 status
。我怎样才能完成这些?
@andrewsi 评论非常好,例如,当您有很多接收者时。在你的情况下,它只是一个额外的字段,所以在我看来,只使用一个 table 并不是溢出。 关于你的情况,你可以在一个简单的 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 字段
(代表 OP 发布。)
感谢@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
分组的邮件,其中还显示您与每个发件人的最新对话。并在用户双方显示正确的消息状态。