【问题标题】:How to set read unread flag in php message system如何在php消息系统中设置已读未读标志
【发布时间】:2015-06-28 03:07:44
【问题描述】:

我正在用 PHP 开发一个 Facebook 类型的消息传递系统。我有一个user_message 表,其中包含sender_idreceiver_idmessageflag 作为已读/未读。在此表中插入一个值后,我将其设为未读,当用户点击消息通知时,状态将更新为已读

单用户可以正常使用。不过,在向多个用户发送消息时,我将 receiver_id 存储为表中的逗号分隔值。我的问题是如何为多个接收器设置标志?例如,如果我要向 3 个用户发送一条消息,那么如何设置 read 标志?任何帮助将不胜感激。

【问题讨论】:

    标签: php


    【解决方案1】:

    虽然向多个用户发送消息时,我将receiver_id 存储为表中的逗号分隔值。

    不要滥用字符串列来表示多个值。在大多数 DBMS 中以这种方式构建的列是不可能索引的,因此您将无法有效地搜索它。这对于“消息接收者”结构尤其重要,因为这意味着不可能有效地搜索特定用户收到的所有消息。这会使许多常见操作(例如检查发送给用户的新消息或查看用户邮箱)在大型网站上变得异常缓慢。

    相反,如果您希望将一条消息的单一表示发送给许多人,而不是为每个人发送一条单独的消息,请使用两个表对此进行建模,例如

    CREATE TABLE message (
        id INTEGER PRIMARY KEY NOT NULL,
        sender_id INTEGER NOT NULL,
        message TEXT NOT NULL
    );
    
    CREATE TABLE message_recipient (
        message_id INTEGER NOT NULL,
        recipient_id INTEGER NOT NULL,
        PRIMARY KEY (message_id, recipient_id)
    );
    

    使用这样的表结构,您可以在message_recipient 对象上放置一个“已读”标志,以便给定消息的每个收件人都有单独的已读状态。

    【讨论】:

    • 感谢您的回复。我做了你提到的同样的事情。我已经创建了两个表,现在一切正常。我真的很感谢你的帮助。非常感谢。我也接受了这个作为答案。
    【解决方案2】:

    1)您可以添加名称为“users_reads”的字段,并在其中输入用户的ID,阅读消息,用逗号分隔。如何检查用户是否阅读了消息:

    if (in_array($userId, explode(',', $row['users_reads']))) { ... }

    2) 您可以在数据库中添加新表“users_reads_messages”,其中包含以下字段: - message_id - reader_id

    3) 你可以用另一个reciever_id 复制消息,我的意思是你把单个用户id 放在这个字段中,对于其他用户你可以在你的表中复制这个消息。

    附言对不起我的英语不好

    【讨论】:

    • 非常感谢您的快速响应,我想我得到了解决方案。我将尝试使用上述解决方案,并接受它作为答案。再次非常感谢兄弟。
    【解决方案3】:

    message 表和receiver 表之间可以有一个联结表。例如 MessageRead 表。它有id(自动增量)message_idreceiver_id。如果 id=10 的用户阅读了 id=5 的消息,则需要执行以下查询:

    INSERT INTO MessageRead(message_id, receiver_id) VALUES(5, 10)
    

    要获取阅读 id=5 消息的用户数,您可以执行以下查询:

    SELECT COUNT(*) FROM MessageRead WHERE message_id = 5
    

    并且,为了检查 id = 10 的用户是否阅读了 id = 5 的消息,请执行以下查询:

    SELECT COUNT(*) FROM MessageRead WHERE message_id = 5 AND receiver_id = 10
    

    如果本次查询结果为1,则表示用户已阅读该消息,否则该用户未阅读该消息。

    【讨论】:

    • 感谢您的回复。我会尝试一下。非常感谢
    猜你喜欢
    • 2015-06-07
    • 2014-05-16
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多