2012-02-02 180 views
1

我正在做一个朋友列表类型的功能,将显示用户的朋友,我有一些逻辑问题。存储朋友的表格的设置方式有3列, userid1,userid2和friendstatus。好友状态1表示用户是朋友,状态0表示请求正在等待。当用户添加另一个用户作为他们的朋友时,发送请求的用户被放置在userid1中,并且接收请求的用户被放置在userid2中。PHP循环逻辑麻烦

所以,我遇到的问题是获取功能来正确选择用户的朋友,而不是用户本人。基本上,我试图让这个函数来确定哪个列是用户(例如我)和哪一列是朋友。

我最初有第一个SQL语句如下,但这也没有工作。

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

下面是我试图创建的逻辑。

  1. 获取用户ID(矿)
  2. 搜索我的ID列1:如果找到,显示第2列(这将是我的朋友)
  3. 我的ID搜索栏2:如果找到,显示栏1 (这将是我的朋友)

函数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); 
       } 
      } 

回答

1

我会用一个单一的UNION'd SQL查询:

$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>'; 
     } 
} 
+0

太棒了,完美的工作! – user1104854 2012-02-02 02:28:37

+0

请不要忘记用mysql_real_escape_string来清理$ myUsername变量!此代码易受SQL注入攻击。 – mpratt 2012-02-02 02:36:07

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

这可能帮助:

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. ,您可以通过查询2.

  3. 从查询1和列“userid1”获取列“userid2”在你的for循环,你总是读取读取所有的朋友第一个记录。因此,在每次迭代中,您都会再次调用相同的查询,并始终只读取第一条记录。相反,您应该运行一次查询并在一个循环中调用mysql_fetch_array()。

例如这里:

$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); 
} 

希望以上帮助!