php循环逻辑麻烦

时间:2012-02-02 01:53:08

标签: php mysql for-loop

我正在开发一个朋友列表类型函数,它将显示用户的朋友,我遇到了一些逻辑问题。设置用于存储朋友的表的方式有3列; userid1,userid2和friendstatus。 friendstatus为1表示用户是朋友,状态为0表示请求正在等待。当用户将另一个用户添加为他们的朋友时,发送请求的用户将被置于userid1中,并且接收该请求的用户将被置于userid2中。

所以,我遇到的问题是让函数正确选择用户的朋友,而不是用户自己。基本上,我正在尝试使用此函数来确定哪个列是用户(例如我)以及哪个列是朋友。

我最初有第一个SQL语句如下,但这也不起作用。

 $friends = mysql_query("Select * from friends where (userid1 = $myUsername OR userid2=$myUsername) AND friendstatus = '1'");

这是我想要创造的逻辑。

  1. 获取用户ID(我的)
  2. 在第1列搜索我的ID:如果找到,则显示第2列(这将是我的朋友)
  3. 在第2列搜索我的ID:如果找到,则显示第1列(这将是我的朋友)
  4. 功能friendslookup只显示信息并提取用户信息。它没有增加逻辑。

    $myUsername = $_GET['myFriends'];
    if(isset($myUsername)){
            $friends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
            $friends2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
            if(mysql_num_rows($friends) > 0 OR mysql_num_rows($friends2) >0 ) {
    
    echo '<table><tr><td>Username </td><td> Location</td></tr>';
            $col1rows = mysql_num_rows($friends);
            $col2rows = mysql_num_rows($friends2);
                }
            for ($i=0; $i<$col1rows;$i++){
                $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
                    $friend = mysql_fetch_array($myFriends);
                    $friend_1 = $friend['userid2'];
                    friendsLookup($friend_1,$myUsername);
                }
            for ($i=0; $i<$col2rows;$i++){
                $myFriends_2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
                    $friend = mysql_fetch_array($myFriends_2);
                    $friend_2 = $friend['userid1'];
                    friendsLookup($friend_2,$myUsername);
                    }
                }
    

3 个答案:

答案 0 :(得分:2)

我建议你在一个SQL中做所有事情(包括那个“friendsLookup”函数,'因为我打赌那里有另一个mysql查询),因为它会变得非常慢。假设您的用户的表是“用户”。使用此SQL:

$sql = "SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid1";

这将获取所有朋友(包括他们的用户信息)。此外,如果您想要排序或限制(或者您希望对结果做进一步的操作),您可以这样做:

例如,您希望按照名字按升序对朋友进行排序:

$sql = "SELECT * FROM (
SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid1 ) tblResult r
ORDER BY r.first_name ASC";

然后你可以通过这样做来获取最终结果:

$query = mysql_query( $sql );
while ( $col = mysql_fetch_array( $query ) ){
  ?>
  <!-- DO YOUR THING HERE WITH PHP -->
  <?php
}

最后,我想评论你的循环。注意你的循环中,你有这个代码:

$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
$friend = mysql_fetch_array($myFriends);

这实际上是不必要的。第一行只是在每个循环中重置您的查询。删除第一行,在第二行,而不是使用$ myFriends,使用$ friends(这是您在顶部的第一个查询)。因此,对于第一个循环中的前两行,它应该如下所示:

$friend = mysql_fetch_array($friends);

对第二个循环也这样做。

答案 1 :(得分:1)

我会使用单个UNION&#cdql查询:

$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
        $friends = mysql_query("
        SELECT userid1 as friendId
        FROM friends
        WHERE userid2 = $myUsername AND friendstatus = 1
        UNION
        SELECT userid2 as friendId
        FROM friends
        WHERE userid1 = $myUsername AND friendstatus = 1
        ");

        if(mysql_num_rows($friends) > 0) {
            echo '<table><tr><td>Username </td><td> Location</td></tr>';
            while($friend = mysql_fetch_array($friends)) {
                $friend_data = friendsLookup($friend['friendId'],$myUsername);
                //display friend data here
            }
            echo '</table>';
        }
}

答案 2 :(得分:1)

这可能会有所帮助:

SELECT (CASE $myUsername
    WHEN `userid1` THEN `userid2`
    WHEN `userid2` THEN `userid1`
END) AS `friend_ids`
FROM `friends`
WHERE $myUsername IN (`userid1`, `userid2`)
AND `friendstatus` = 1;

您的逻辑几乎没有问题 -

  1. 您不需要多次运行相同的查询。

  2. 只使用前2个查询,您可以通过从查询1中获取列“userid2”和从查询2中获取“userid1”列来阅读所有朋友。

  3. 在你的for循环中,你总是在读第一条记录。因此,在每次迭代中,您再次调用相同的查询并始终只读取第一条记录。相反,您应该运行一次查询并在循环中调用mysql_fetch_array()。

  4. 例如:

    $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
    while ($friend = mysql_fetch_array($myFriends) {
        $friend_1 = $friend['userid2'];
        friendsLookup($friend_1,$myUsername);
    }
    

    希望以上有所帮助!

相关问题