Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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友好系统_Php_Sql - Fatal编程技术网

php友好系统

php友好系统,php,sql,Php,Sql,如果有人能帮我解决这个问题,我会非常感激的 我正在制作一个网站,我希望注册用户能够将彼此添加为朋友 此人必须“邀请”另一个注册用户(在数据库上)。另一个人将收到某种通知。如果该人忽略了通知,则不会发生任何事情,当他/她批准时,他们是朋友 现在我对我将要使用的表格有了一个想法: +----------------------------------------+ | Requests | +------------------------

如果有人能帮我解决这个问题,我会非常感激的

我正在制作一个网站,我希望注册用户能够将彼此添加为朋友

此人必须“邀请”另一个注册用户(在数据库上)。另一个人将收到某种通知。如果该人忽略了通知,则不会发生任何事情,当他/她批准时,他们是朋友

现在我对我将要使用的表格有了一个想法:

+----------------------------------------+
|               Requests                 |
+----------------------------+-----------+
| id | user_from |  user_to  |   status  |  
+----+-----------+-----------+-----------+
|    |           |           |           |
|    |           |           |           |
|    |           |           |           |
|    |           |           |           |
+----------------------------+-----------+
正如我所说,这只是我想使用的一个想法,但我不知道当我有一个链接添加一个人作为朋友时,php中的代码会是什么

我认为管理员应该批准发送的请求以及用户是否批准。我不知道那张桌子会是什么样子

我考虑使用内部连接将两个用户作为朋友“连接”。但是,我还是不完全确定该怎么做。这会出现在我的php中吗?比如说friends.php

SELECT name, email FROM users

INNER JOIN friends ON users.id = friends.user.id WHERE users.id = 1
正如我所说,我有一个很好的想法做什么,但当谈到编码它,我不完全知道如何做到这一点


谢谢

您应该有一个简单关联user.id的关系表。

+-----------------------------------------+
|               relationships             |
+-----------------------------------------+
| id | user_id1  |  user_id2   |  status  |
+----+-----------+-------------+----------+
|    |           |             |          |
|    |           |             |          |
|    |           |             |          |
|    |           |             |          |
+------------------------------+----------+
其中user_id1和user_id2都是user.id。注意:我可能会将status设置为enum,类似于“待定、拒绝、朋友、敌人”。我最初想使用bool,但如果以后还有其他想要的状态呢?比如说,你可能会记录破碎的友谊,或者其他关系

然后您只需执行一个multiple where子句来确定朋友:
WHERE(user\u id=:id或friend\u id=:id)和status='friend'
您的实现可能会有所不同-有多种方法可以提供您想要的功能,即:

  • 用户A请求成为用户B的朋友
  • 用户B收到朋友请求的通知,可以接受、拒绝或忽略
  • 每当用户B接受请求时,他们都是朋友
  • 由于你的问题含糊不清,我只能提出建议,因为没有提出任何具体问题

    SQL模式-您的表看起来适合好友请求。您可能需要澄清表名,因为请求可能是一个广泛的主题。如果您在user\u from、user\u to列上定义了唯一的索引,则不一定需要id列(这将防止向同一个人重复朋友请求)。同样,这是你的选择,没有一个答案一定是“正确的”。对于状态字段,考虑使用请求的有效状态的枚举,例如EnUM(“待定”、“拒绝”)。 就通知而言,最好的方法是在用户发起好友请求时将通知插入通知表,而不是通过检查新的好友请求来获取通知。第一个更具可扩展性,允许您出于各种原因发出通知

    最后,一旦好友请求成功,您可以执行以下两项操作之一:

  • 从friend requests表中删除请求,并插入friends表
  • 将请求标记为已接受
  • 同样,这里是您对实现的选择。选项#1允许您轻松查询好友,但会为每个好友生成一个额外的表和(可能)两行,如果您选择这样实现它的话。选项#2要求您查询requests表中已完成的请求,这使得您的查询稍微复杂一点,而且我的理解也不那么直观,因为好友和好友请求不一定相关。此外,您可以在Friend Requests表中添加没有意义的字段,例如友谊开始的日期

    查询-当您需要查找用户的好友时,您可以执行类似于以下操作,具体取决于您对SQL模式的选择:

    SELECT * FROM friends WHERE user_id = $user_id
    SELECT * FROM friends WHERE user_id = $user_id OR friend_id = $user_id
    SELECT * FROM friend_requests WHERE (user_from = $user_id OR user_to = $user_id) AND status = "COMPLETED"
    

    我不认为这是什么…最好保持请求与实际好友列表分开。审批通过后,您可以删除关联的请求记录,并在友谊表中创建一条新记录,以显示友谊为“活动”。好的,但状态将是什么?e、 g.待定。。。或批准?甚至不需要id字段。PK可以是(用户id,朋友id)Ok耶是真的。。。但我仍然想知道批准请求的某种状态应该在哪里??或者那是一张和朋友分开的桌子?@MarcB那是一个很不靠谱的谎言,我的朋友。有了这个id,就可以很容易地用一个id作为目标。有很多好的工具不能处理多个主键。当您强制执行多键时,id使其非常易于处理。“好的”工具不能处理复合键,根据定义是“不好的”。拥有一个单独的id字段可以创建多个重复的用户/朋友对。您可以在这两个字段上放置一个唯一的复合键,但随后您基本上又重新创建了一个PK,而您所谓的“好”工具将再次自我呕吐。