2012-02-02 6 views
1

사용자의 친구를 표시하고 일부 논리 문제가있는 친구 목록 유형 기능을 사용하고 있습니다. 친구를 저장하는 테이블 설정 방법에는 3 개의 열이 있습니다. userid1, userid2 및 friendstatus. friendstatus 1은 사용자가 친구임을 나타내며 상태 0은 요청이 보류 중임을 나타냅니다. 사용자가 다른 사용자를 친구로 추가하면 요청을 보낸 사용자는 userid1에 저장되고 요청을받은 사용자는 userid2에 저장됩니다.PHP 루프 논리 문제가 발생했습니다.

그래서 내가 겪고있는 문제는 사용자가 아닌 사용자의 친구를 적절하게 선택하는 기능을 얻는 것입니다. 기본적으로이 함수는 사용자 (예를 들어)와 열 (Column)을 결정하는 데 사용됩니다.

원래 나는 다음과 같은 첫 번째 SQL 문을 가졌지 만 이것도 작동하지 않았습니다.

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

다음은 내가 작성하려고하는 논리입니다.

  1. 가져 오기 사용자 ID (광산) 내 ID에 대한
  2. 검색 열 1 : 발견하는 경우, (내 친구가 될 것입니다) 표시 란이 내 ID에 대한
  3. 검색 열 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 쿼리 사용하는 것이

: 나는 다른 MySQL의 쿼리가 내기 사촌 '(즉, "friendsLookup"기능을 포함

$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

+0

mysql_real_escape_string을 사용하여 $ myUsername 변수를 삭제하는 것을 잊지 마십시오! 이 코드는 SQL 삽입에 취약합니다. – mpratt

2

난 당신이 하나의 SQL 모든 것을 할 제안을 왜냐하면 그것은 정말로 느려질 것이기 때문입니다. 사용자의 테이블이 "사용자"라고 가정합니다. 이 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"를 가져 오는 모든 친구를 읽을 수 있습니다 첫 번째 기록. 따라서 각 반복에서 동일한 쿼리를 다시 호출하고 항상 첫 번째 레코드 만 읽습니다. 대신 쿼리를 한 번 실행하고 루프에서 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); 
} 

위의 희망이 도움이!

관련 문제