2011-10-14 83 views
0

如果有人可以帮助我解决这个问题,我将非常感激!php好友系统

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

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

现在我有表,我要使用一个想法:

+----------------------------------------+ 
|    Requests     | 
+----------------------------+-----------+ 
| id | user_from | user_to | status | 
+----+-----------+-----------+-----------+ 
| |   |   |   | 
| |   |   |   | 
| |   |   |   | 
| |   |   |   | 
+----------------------------+-----------+ 

正如我所说,这只是一个想法,我想用,但我不知道该代码将在什么当我有一个链接添加一个人作为朋友的PHP。

我认为管理员批准发送的请求和用户批准或不批准。我不知道桌子的外观。

我想过使用INNER JOIN作为朋友“加入”这两个用户。但是,不完全确定如何去做。这会在我的PHP?让我们说friends.php?

SELECT name, email FROM users 

INNER JOIN friends ON users.id = friends.user.id WHERE users.id = 1 

正如我所说的,我有什么做一个好主意,但是当涉及到编码它,我不能完全确定该怎么做......

谢谢!

+1

我不认为这是什么[INNER JOIN](http://www.w3schools.com/sql/sql_join_inner.asp)确实... – someone

+1

最好将请求与实际的朋友列表分开。当审批通过时,您可以删除关联的请求记录,并在友情表中创建新记录以显示友谊是“实时”的。 –

回答

1

您应该有一个关联表,它只是将user.id关联起来。

+-----------------------------------------+ 
|    relationships    | 
+-----------------------------------------+ 
| id | user_id1 | user_id2 | status | 
+----+-----------+-------------+----------+ 
| |   |    |   | 
| |   |    |   | 
| |   |    |   | 
| |   |    |   | 
+------------------------------+----------+ 

凡user_id1和user_id2都user.id.注意:我可能会让状态成为一个枚举,像'等待,拒绝,朋友,敌人'。我最初想到使用布尔,但如果稍后还有其他期望的状态呢?就像也许你跟踪破碎的友谊或其他某种关系。

然后你只需做多where子句来确定的朋友: WHERE (user_id=:id OR friend_id=:id) AND status='friend'

+0

好的,但状态会在哪里?例如等待...还是批准? –

+0

甚至不需要为此需要一个id字段。 PK可能只是(user_id,friend_id) –

+0

好吧,是真的......但我仍然想知道某种状态应该是批准请求?或者,这是一个除了朋友的桌子? –

1

您的实现可以有所不同 - 有多种方式,提供你想要的功能,即:

  1. 用户A请求用户B的朋友
  2. 用户B收到朋友请求的通知,并且可以接受,拒绝或忽略
  3. 每当用户B接受请求时,他们都是朋友ds

由于您的问题含糊不清,我只能提供建议,因为没有提出任何具体问题。

SQL架构 - 您的表格看起来适合朋友请求。您可能需要澄清表名,因为请求可能是一个广泛的主题。如果您在user_from,user_to列上定义唯一索引(这将防止重复的朋友请求发送给同一个人),则不一定需要id列。再次,这是你的选择,没有人的答案必然是“正确的”。对于状态字段,考虑使用请求的有效状态的ENUM,例如,ENUM(“PENDING”,“DECLINED”)。

就通知而言,最好的方法是在用户启动好友请求时将通知插入通知表中,而不是试图通过检查新的好友请求来派生通知。第一个更具可扩展性,并允许您出于各种原因提出通知。

最后,一旦好友请求成功,你可以做两件事情之一:

  1. 删除请求,从朋友请求表,并作为接受
  2. 插入一个朋友表
  3. 马克请求

再次,您在这里选择实施。选项#1允许您轻松查询朋友,但为每个友谊生成一张额外的表格和(可能)两行,如果这是您选择实施它的方式。选项#2要求您查询已完成请求的请求表,这使得您的查询稍微复杂一些,因为朋友和朋友请求不一定是相关的,所以IMO不那么直观。此外,您可以在Friends表中添加字段,例如友谊开始的日期,这在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"