2012-02-02 176 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); 
} 

希望以上幫助!