在php / pdo中创建一个朋友列表并使用三个表

时间:2016-12-23 19:46:44

标签: php mysql pdo

像标题一样说,尝试使用mysql和pdo在php中建立朋友列表。 有三个表,一个用户和一个朋友以及一个细节

用户: ID 用户名

朋友: 用户身份 friendID 状态

详细说明: profileImg

foreach($db->query('SELECT * FROM FF_Users 
LEFT JOIN FF_User_Details ON FF_User_Details.user_id = FF_Users.id 
LEFT JOIN FF_UserRoles ON FF_UserRoles.user_id = FF_Users.id
LEFT JOIN FF_ZIP_nb_NO ON FF_ZIP_nb_NO.Postnummer = FF_User_Details.zip
LEFT JOIN FF_User_Settings ON FF_User_Settings.user_id = FF_Users.id
INNER JOIN FF_MyFriends ON ((FF_MyFriends.user_id = FF_Users.id AND FF_Users.id) OR (FF_Users.id = FF_Users.id AND FF_MyFriends.user_id))
GROUP BY FF_Users.id') as $row) {
if ($isFriends) {
    echo '                    <button type="button" class="btn btn-primary btn-xs pull-right read-only">';
echo '                      <i class="fa fa-user"> </i> ' . USERS_ADD_FRIEND;
echo '                    </button>';
} else {
echo '                    <button type="button" class="btn btn-primary pull-right btn-xs read-only disabled">';
echo '                      <i class="fa fa-user"> </i> ' . USERS_IS_FRIEND;
echo '                    </button>';
}
}

我在这里做错了什么?只有空白页一遍又一遍。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您对var_dump显示object(PDO)#2 (0) { }的评论让我相信您的查询根本不会返回任何数据。

我不完全确定这是您的问题,因为我无法访问您的数据,但这条线看起来很可疑:

INNER JOIN FF_MyFriends ON (
    (FF_MyFriends.user_id = FF_Users.id AND FF_Users.id)
    OR
    (FF_Users.id = FF_Users.id AND FF_MyFriends.user_id)
)
  1. 首先,你的条件很奇怪。
    1. 在第一部分中,您要比较FF_MyFriends.user_id = FF_Users.id,这似乎没问题,然后AND FF_Users.id看起来很奇怪。如果你想确保FF_Users.id不是NULL,我建议你明确检查一下(AND FF_Users.id IS NOT NULL)。
    2. 在第二部分中,您将比较FF_Users.id = FF_Users.id,它将按定义返回true。 :)
  2. 您在其他所有桌面上使用LEFT JOIN,但在{1}}上使用INNER JOIN可以意味着什么是找不到匹配的朋友,并且数据库根本没有返回任何内容,因为没有匹配。
  3. 我建议你a)重新考虑是否需要INNER JOIN和b)清理你的加入条件。

    我在这里猜测一下,但看起来你正试图在任何方向上抓取所有用户的朋友(即检查用户A是否A是他的朋友) B或B是A)的朋友。如果是这种情况,请尝试:

    SELECT DISTINCT *
    -- etc.
    INNER JOIN FF_MyFriends ON
        FF_Users.id = FF_MyFriends.friendID 
        OR FF_Users.id = FF_MyFriends.userID
    

    DISTINCT非常重要,因为如果A是A的B和B的朋友,那么你最终会使用同一行两次。

    我希望它有所帮助。如果它不是您所需要的,请准确添加您需要的评论。