坚持最好的朋友功能

时间:2014-05-17 22:20:18

标签: php mysql mysqli

我目前正在开展一个项目,用户每发送一条消息就会获得+2分,而他们发送的每张图片都会获得+5分。目前,我正忙于用户的个人资料页面。我有一个盒子,我希望根据这些点,显示该用户的3个最好的朋友。

我还有一个friend_request功能,因为用户可以为公众锁定他们的帐户,所以只有经过批准的朋友才能看到他们最喜欢的内容。所以我做的是,我在我的数据库中的friends表中添加了一个'points'列,因为我将检查最好的朋友。

但是现在我有点卡住..我当前的代码版本只检查'friend_two'用户并排名最高>最低点数。问题是我可以是friend_two而不是'friend_one'而其他人可以'friend_one'而不是'friend_one',这取决于邀请另一个人的人。

如何将其存档,以便检查两列而不仅仅是'friend_two'列?

我的get_bestFriends()函数:

/// BEST FRIENDS FUNCTION - lIMITED TO 3
function get_bestFriends($mysqli, $username) {

    //Get the visiting profiles username
    $username = safe($mysqli,$_GET["username"]);

    //Get all friends out of the database and put it into an array
    $showBestFriends = array(); 
    $getBestFriends = mysqli_query($mysqli,"SELECT * FROM friends WHERE ((friend_one = '$username') OR (friend_two = '$username')) AND invited = '1' AND accepted = '1' ORDER BY points DESC LIMIT 3") OR die (mysqli_error($mysqli));
    if (mysqli_num_rows($getBestFriends) > 0){
        while($row = mysqli_fetch_array($getBestFriends)){
            $row = array( 'friend_one' => $row['friend_one'], 
            'friend_two' => $row['friend_two'], 
            'points' => $row['points'] );
            $showBestFriends[] = $row;
        } 

        //Start displaying the arrays content
        foreach ($showBestFriends as $stt):

        //Get the avatars of the three best friends
        $getBestFriendsAvatar = mysqli_query($mysqli,"SELECT avatar FROM members WHERE username = '".$stt['friend_two']."' ") OR die (mysqli_error($mysqli));
        $ava = mysqli_fetch_array($getBestFriendsAvatar);
        $avatarURLf = $ava['avatar'];

            echo '<div class="best-friend">';
            echo '<div class="profileContentBox_avatar">';
            echo '<img id="user-avatar" data-title="SHOW USERINFO" title="Avatar from '.$username.'" src="'.$ava['avatar'].'" class="profileContentBox_avatar thumbnail-small" draggable="false">';
            echo '<div class="profileContentBox_messages">'.$stt['points'].'</div>';
            echo '<div class="profileContentBox_username">'.$stt['friend_two'].'</div>';
            echo '</div>';
            echo '</div>';

        endforeach;

    } else {
        //There are currently no (best) friends yet
        echo '<div style="text-align: center; font-size: 9pt;">No best friends found</div>';

    }
}

我只是通过回显函数来显示它们。

2 个答案:

答案 0 :(得分:0)

您需要规范化您的数据,以便系统可以处理朋友关系&#34;更一般地说,如果您希望用户能够拥有更多朋友,那么您就不需要添加更多列。

尝试使用此数据库结构:

user
---
id (int)                 } primary key
name (varchar)

friend_of
---
from_user_id (int, fk)   } primary key
to_user_id (int, fk)     } primary key
is_invited (bool)
is_accepted (bool)

你也可以删除is_invited - 在这种规范化的形式中,is_accepted就足够了。虚假意味着被邀请,真实意味着接受。

要获取特定用户的所有朋友,您可以执行以下操作:

SELECT
    user.*
FROM friend_of fo
INNER JOIN user ON (fo.to_user_id = user_id)
WHERE
    fo.from_user_id = 123 /* This is the 'from' user */
    AND fo.is_accepted = true

答案 1 :(得分:0)

可能已经解决了,最终代码:

// BEST FRIENDS FUNCTION - LIMITED TO 3
function get_bestFriends($mysqli, $username) {

    //Get the visiting profiles username
    $username = veilig($mysqli,$_GET["username"]);

    //Get all friends out of the database and put it into an array
    $showBestFriends = array(); 
    $getBestFriends = mysqli_query($mysqli,"SELECT * FROM friends WHERE ((friend_one = '$username') OR (friend_two = '$username')) AND invited = '1' AND accepted = '1' ORDER BY points DESC LIMIT 3") OR die (mysqli_error($mysqli));
    if (mysqli_num_rows($getBestFriends) > 0){
        while($row = mysqli_fetch_array($getBestFriends)){
            $row = array( 'friend_one' => $row['friend_one'], 
            'friend_two' => $row['friend_two'], 
            'points' => $row['points'] );
            $showBestFriends[] = $row;
        } 


        //Start displaying the arrays content
        foreach ($showBestFriends as $stt):

        //Get the avatars of the three best friends

            //CHECK IF THE $USERNAME IS NOT EQUAL TO FRIEND_ONE. 
            if ($stt['friend_one'] != $username){

                $getBestFriendsAvatar = mysqli_query($mysqli,"SELECT avatar FROM members 
                WHERE username = '".$stt['friend_one']."' ") OR die (mysqli_error($mysqli));
                $ava = mysqli_fetch_array($getBestFriendsAvatar);
                $avatarURLf = $ava['avatar'];

            } else if ($stt['friend_two'] != $username) {

                $getBestFriendsAvatar = mysqli_query($mysqli,"SELECT avatar FROM members 
                WHERE username = '".$stt['friend_two']."' ") OR die (mysqli_error($mysqli));
                $ava = mysqli_fetch_array($getBestFriendsAvatar);
                $avatarURLf = $ava['avatar'];
            }

            echo '<div class="best-friend">';
            echo '<div class="profileContentBox_avatar">';
            echo '<img id="user-avatar" data-title="SHOW USERINFO" title="Avatar from '.$username.'" src="'.$ava['avatar'].'" class="profileContentBox_avatar thumbnail-small" draggable="false">';
            echo '<div class="profileContentBox_messages">'.$stt['points'].'</div>';

            //TEST
            if ($stt['friend_one'] != $username){
            echo '<div class="profileContentBox_username">'.$stt['friend_one'].'</div>';
            } else if ($stt['friend_two'] != $username) {
                echo '<div class="profileContentBox_username">'.$stt['friend_two'].'</div>';
            }

            echo '</div>';
            echo '</div>';

        endforeach;

    } else {
        //There are currently no (best) friends yet
        echo '<div style="text-align: center; font-size: 9pt;">No best friends found</div>';

    }
}