2012-02-02 10 views
1

私は友人リストタイプの機能に取り組んでいます。これはユーザーの友人を表示し、ロジック上問題があります。友人を保存するためのテーブルが設定される方法は、3つの列があります。 userid1、userid2、およびfriendstatusです。 friendstatusが1の場合はユーザーが友人であることを示し、ステータスが0の場合はリクエストが保留中であることを示します。ユーザーが別のユーザーを自分の友人に追加すると、要求を送信したユーザーはuserid1に置かれ、要求を受け取ったユーザーはuserid2に入れられます。PHPループロジックのトラブル

私は、自分自身ではなく、ユーザーの友人を適切に選択する機能を使用しています。基本的には、私はどのカラムがユーザ(私の場合)であり、どのカラムがフレンドであるかを判断するためにこの関数を取得しようとしています。

私は元々次のような最初のSQL文を持っていましたが、これはどちらもうまくいきませんでした。

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

ここに私が作成しようとしているロジックがあります。

  1. のGetユーザーID(鉱山)私のIDについて
  2. 検索コラム1:見つかった場合は、(私の友人になります)表示欄2私の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」機能を含む1つの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

+0

$ myUsername変数をmysql_real_escape_stringでサニタイズすることを忘れないでください!このコードはSQLインジェクションに対して脆弱です。 – mpratt

2

をそれは本当に遅くなるからです)。あなたのユーザのテーブルが「ユーザ」であると仮定します。この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); 

これは実際には不要です。最初の行は、単一のループごとにクエリをリセットするだけです。最初の行を削除し、2行目で$ myFriendsを使用する代わりに、$ friends(これは先頭にある最初のクエリです)を使用します。したがって、最初のループの最初の2行は次のようになります。

$friend = mysql_fetch_array($friends); 

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つのクエリを使用して、あなたは、ループのために、あなたは常に読んでいるではクエリ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); 
} 

は、上記の情報がお役に立てば幸い!