使用PHP处理Follow/Followers

使用PHP处理Follow/Followers,php,mysql,Php,Mysql,在我的网站中,我有一个相互关注的概念,就像推特一样,我有一个用户连接表,结构如下 ============================================================== 连接到|连接者|会话ID |连接状态|记录日期 ============================================================== 连接到保留您要连接的用户 connectedBy会保留正在连接的用户 会话ID再次保留正在连接的用户 现在假设用户A连

在我的网站中,我有一个相互关注的概念,就像推特一样,我有一个用户连接表,结构如下

==============================================================

连接到|连接者|会话ID |连接状态|记录日期

==============================================================

连接到保留您要连接的用户

connectedBy会保留正在连接的用户

会话ID再次保留正在连接的用户

现在假设用户A连接到用户B,表条目如下

===============================

B|id | A|id | A|id |已连接|日期

===============================

现在A跟在B后面,现在即使B跟在一个条目后面

===============================

A|u id | B|u id |已连接|日期

===============================

现在我想要的是,如果两者都在互相跟踪,我有一个叫做网络的页面,所以如果我是用户a和我登录,如果我进入我的网络页面,我应该看到跟踪我的人在跟踪我,但我无法确定我应该如何检测哪些用户在跟踪我…这就像谷歌加I gues,如果你跟踪一个用户,你在跟踪他,但如果他跟踪你的时间比你是朋友的时间长,那么我是否应该再添加一个字段,比如说fieldX,在连接之前,我检查该用户是否在跟踪我,我应该将这两个记录都更新为field X中的朋友


另外,我尝试了很多东西,所以不要问我尝试了什么,我尝试了,尝试了,但仍然无法理解这似乎是一个非常简单的问题。您只需首先查询用户是否已经有连接,看看是否应该将其转换为相互连接

$query = "SELECT c.ConnectedTo, cc.ConnectedBy
          FROM connections c
          LEFT JOIN connections cc ON c.ConnectedTo=cc.ConnectedBy AND cc.ConnectedTo='" . $loged['my_loged_user_id'] . "'
          WHERE c.ConnectedBy='" . $loged['my_loged_user_id'] . "'";
$sql = $mysqli->query($query);
while($row = $sql->fetch_assoc()) {
    if(isset($row['ConnectedBy'])) {
        // I'm connected with $row['ConnectedTo'] who is also following me
    } else {
       // I'm connected with $row['ConnectedTo'] but he don't follows me
    }
}
SELECT * FROM tbl_connections WHERE ConnectedTo = $foreign_user_id OR connectedBy = $foreign_user_id
有了行(或没有行)后,您可以判断关系的方向,并根据需要附加用户ID:

if($result->rowCount() > 0){
    foreach($result as $row){
        if($row['ConnectedTo'] == $my_user_id) $row['ConnectedBy'] = $foreign_user_id;
        if($row['ConnectedBy'] == $my_user_id) $row['ConnectedTo'] = $foreign_user_id;
        $row['Connect_Status'] = 2; // 2 denotes that it is a mutual connection on the graph
        // Save row
        break;
    }
}else{
    // Insert new row
}
这只是一个简单的回答

诚然,这不是最优雅的解决方案,但它在如何以及何时建立相互关系方面提供了更多的力量。正如你会注意到的,G+上两个人之间的双重关系并不总是意味着朋友。这实际上也取决于你把他们放在哪个小组

编辑 以上代码仅在您结交新朋友时使用。查询时,您可以只查询所有行,然后显示(例如)由连接\u状态判断的相互连接的标签,也可以只查询该连接\u状态:

SELECT * FROM tbl_connections WHERE Connect_status = 2

将获得所有相互连接。

假设您的用户ID为
@ID
,连接表名称为
连接
。然后,以下查询将列出所有连接回您的用户的ID:

select 
   me2friend.ConnectedTo
from 
   CONNECTION me2friend,
   CONNECTION friend2me
where
   me2friend.ConnectedBy = @id and
   me2friend.ConnectedTo = friend2me.ConnectedBy and
   friend2me.ConnectedTo = @id

当我将所有连接都放在一个表中时,如何使用左连接?左连接仍应处理它。测试一下。我的建议是,不要试图添加一个额外的字段来表示他们是朋友,只需检查他们是否出现在B的关注列表中,以及B是否出现在A中。我们在我的一个网站上试过。。。糟糕的举动。哈哈,我也需要做出糟糕的举动。我想,我需要在一个循环中检查用户是否连接到我,但这是一个非常糟糕的选择。当我进入他的个人资料页面时,很容易检查,但当我在我的帐户中时,我怎么可能在我的查询中添加外国用户id?我只能使用当前会话的会话iduser@V413HAV如果你没有外国用户id,你怎么知道你在连接谁?看,我会告诉你,如果用户A连接到B,B连接到A,当用户A访问B的配置文件时,我使用用户A的会话密钥检查,并在URL中获得我传递给用户B配置文件的值,但是,如果我在我的帐户中,我想知道我有多少用户是朋友,我没有任何外键,我所拥有的只是一个用户ID,我在会话中选择使用它it@V413HAV你能用你自己的用户名替换$foreign\u user\u id吗?在这种情况下应该可以。不,我不能,如果我把我所有的连接放在一个循环中,我需要在循环中添加一个新用户时总是进行查询,这很糟糕,我的意思是一个用户加载并进行检查,那么可能我只有一个表,这是什么?”“我的朋友”和“我的朋友”?没有这种情况fields@V413HAV他选了两次桌子,他基本上和Matei做的一样,但用的不同words@Sammaye但是我应该把什么传给我的朋友呢?我真的不明白this@V413HAV无,他正在执行的双
选择
me2friend
作为您显示给我们的表的
连接的别名。所以他只是把你的表格化名为
me2friend
friend2me
。对于SQL变量
@id
,您可以像平常一样用PHP变量替换它。是的,这是一个想法——比使用单独的标志来指示朋友关系是双向的要好得多。然而,@语法可能会让人困惑——也许可以用文字字符串重写它,使之更容易!