Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP专用消息(PM)系统_Php_Mysql_Private Messaging - Fatal编程技术网

PHP专用消息(PM)系统

PHP专用消息(PM)系统,php,mysql,private-messaging,Php,Mysql,Private Messaging,我计划为我的用户制作一个PM系统,总的来说似乎很简单,但从我看到的制作PM系统的教程来看,有一个问题 按照我计划的工作方式,会有一些行,比如,user_from,user_to,然后message-user_from将是发送者,将在他的send messages中看到消息,user_to将是接收者,并将在他的收件箱中看到消息。但是,如果一个用户想从他们发送的文件夹中删除一封邮件,而另一个用户不想从他们的收件箱中删除该邮件,该怎么办 有什么简单的方法可以做到这一点吗 在Gmail和Facebook

我计划为我的用户制作一个PM系统,总的来说似乎很简单,但从我看到的制作PM系统的教程来看,有一个问题

按照我计划的工作方式,会有一些行,比如,user_from,user_to,然后message-user_from将是发送者,将在他的send messages中看到消息,user_to将是接收者,并将在他的收件箱中看到消息。但是,如果一个用户想从他们发送的文件夹中删除一封邮件,而另一个用户不想从他们的收件箱中删除该邮件,该怎么办

有什么简单的方法可以做到这一点吗


在Gmail和Facebook这样的对话中包含这些信息也不错,但这可能很难编码(任何教程都值得欣赏)

您只需创建两行,然后添加一列。例如:

owner_id | user_from | user_to | mailbox_folder | Message
1          1           2         Sent             Hi
2          1           2         Inbox            Hi
其他列:唯一的行id、时间戳、主题行等

然后,您的邮箱将基于owner_id列构建,每个用户都有自己的副本可根据自己的选择进行移动/删除


要添加对话,可以添加列或其他表。如果是新消息,请获取新的对话id,否则使用相同的id。按时间戳查询。

使用所谓的软删除。这意味着当记录被“删除”时,它实际上从未从数据库中删除,而是将一个标志设置为delete(删除),允许您在需要时从用户界面中删除它,同时仍可以访问数据。因此,对于这种情况,您可以再创建两列,分别称为user_to_delete和user_from_delete。当其中一项设置为true时,您将知道不在相应用户的收件箱/发件箱中显示消息。祝您好运。

您可以将用户从已删除的行添加到已删除的行,并仅在未删除时显示消息


要在对话中显示消息,您可以添加一个父id,并使用相同的父id显示所有消息。PM系统比一个表稍微复杂一些。如果你下午超过一个人怎么办? 在这种情况下,您可能需要多个表。一个用于用户、消息等。。。您可以使用主键和外键将它们链接起来

尝试查找关系数据库。 这应该让你开始:
是的,有一个简单的方法!有两个以上的列,分别是
sender\u deleted
receiver\u deleted
。如果其中一个“删除”了该消息,则使用值1更新该列。例如显示消息时,您可以选择消息,并确保该值不同于1。等等。

另一种方法是添加两列,以确定所有者或收件人是否已请求删除(隐藏)邮件

owner_id | user_from | user_to | mailbox_folder | Message | Owner_hide | Recipient_hide
1          1           2         Sent             Hi         1           0

您可以通过几种方式解决此问题,但我可能会在表中添加几个标志(从_deleted到_deleted):

  • 将相应的标志更新为1,而不是删除消息
  • 列出消息时,过滤掉已标记的消息
  • 您可以设置脚本,以便在标记后,如果两个字段都被标记,则可以实际删除该行

我建议采用以下数据库设计:

MESSAGES
+----------+------------------+---------------------------+
|    id    |    subject_id    |    body                   |
+----------+------------------+---------------------------+

SUBJECTS
+----------+-------------+--------------+-----------------+
|    id    |    title    |    author    |    receivers    |
+----------+-------------+--------------+-----------------+

INBOX
+----------+---------------+--------------+---------------+
|    id    |    user_id    |    msg_id    |    read       |
+----------+---------------+--------------+---------------+

OUTBOX
+----------+---------------+------------------------------+
|    id    |    user_id    |    subject_id                |
+----------+---------------+------------------------------+
发送邮件时,在收件箱表中为所有收件人创建新行,在发件箱表中为发件人创建新行。在messages表中插入一行,其中包含主题ID和消息正文。在“主题”表中插入一行,其中包含标题、作者和所有收件人(如果发件人开始了新主题或转发了完整对话或单个邮件,则使用现有主题ID将邮件添加到“邮件”表中),这样即使其中一个收件人从其收件箱中删除邮件,也会保留此信息(在本例中,删除收件箱表中的行)


对于发件箱,不需要“读取”标志,请注意,只使用主题ID。

这会添加大量重复数据。@cwhelms/shrug.它模仿其他所有系统。空间效率非常低。无论有多少人使用它,它仍然是糟糕的设计。复制糟糕的设计甚至比创建它更糟糕。很高兴你们两个可以拍拍ea这听起来很comlpex,也许可以看看,但我认为我的技能还没有那么好:-)这将节省你以后的时间,当你想添加更多功能时。只需要几个表:users,messages,以及一个为用户和消息将用户ID和消息相互链接的表(我称之为链接表,但这可能不是正确的措辞:/)。听起来像其他建议,但没有提到在两者都将消息标记为deleted时删除行,谢谢。:-)