2011-12-31 25 views
1

私は自分のウェブサイト用の友人システムを構築しようとしています。使用して1つの変数から複数の値を取得する方法は?

INSERT INTO friendship 
    VALUES 
(1, 2), 
(1, 3), 
(1, 5); 

私は(この例では、ID 1)利用者の全てを取得することができています友人のIDS:

CREAT TABLE users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL 
) Engine=InnoDB; 

CREATE TABLE friendship (
    member1 INT UNSIGNED NOT NULL, -- user's ID 
    member2 INT UNSIGNED NOT NULL, -- friend's ID 
    FOREIGN KEY (member1) REFERENCES users (id), 
    FOREIGN KEY (member2) REFERENCES users (id), 
    UNIQE (member1, member2) 
) Engine=InnoDB; 

サンプル友情データ:テーブル構造は次のようなものに設定されています以下:

$query = mysql_query("SELECT * FROM friendship_table WHERE member1='1'"); 
while($row = mysql_fetch_assoc($query)) { 
    $memberid = $row['member2']; 
} 

私が今したいことは、友人の名前を取得することです。この例では、memberid(表のmember2列)変数の値は2,3および5です。 if/elseif型のステートメントを実行して、そのメンバーIDを確認します。種類のこのような:

if($memberid == "2") { 
    echo "Bob is your friend"; 
} elseif($memberid == "3") { 
    echo "Joe is your friend"; 
} elseif($memberid == "3" && $memberid == "2") { 

//This line is the problem, the variable has multiple values in it (2,3,5) so I think it doesn't understand that and just uses one value 

    echo "Bob and Joe are your friends!"; 
} else { 
    //... 
} 

だから、問題はその変数がそれに割り当てられた2つの特定の値を持っている場合、私は確認したいとき、それはその値のすべてをチェックしないということです。どのようにしてすべての値(2,3,5)をチェックできるようにすることができますか?

+0

を使用して、より良い方法でこの仕事を行うことができ、あなたはしたくありませんPHPコード内のユーザー名をハードコードします。それはより良いSQLクエリで解決されるのが最も良い問題です。その部分も見せてください。 – mario

+0

@mario質問: "SELECT * FROM friendship_table WHERE member1 = '1'" – randomphp

+0

質問を更新して追加情報を追加してください。一般的に、コメントで返信するのではなく、あなたの投稿を更新することによって、明確化の要求に応えます。一つのこととして、コメントを読まなければ問題は理解できるはずです。別の例として、SOはQAとサイトであり、フォーラムではなく、コメントは意図されておらず(また、適切ではない)、議論のためのものでもありません。 – outis

答えて

0

このライン:

$memberid == "3" && $memberid == "2" 

は次のようになります。

switch ($memberid) { 
    case "2": // do something 
     break; 
    case "3": // do something 
     break; 
    case "5": // do something 
     break; 
    case "1": 
    case "4": 
    case "7": // do something 
     break; 
    default: // handle default case 
     break; 
} 
+0

返事をありがとうが、私はそれを試みたが、どちらもうまくいかなかった。そして、どのように私はスイッチを使用し、2つの数字の場合がありますか?次のように:case: "2" || "3"、< - それは可能ですか? – randomphp

+0

これは確かに可能ですが、私のコード "1"を確認してください:case "4":case "7":本質的に "1"を意味します。 "4" || "7" – anubhava

1

$memberidこと:

$memberid == "3" || $memberid == "2" || $memberid == "5" 

私はまた、あなたがswitch/caseの代わりに、このようなif/elseif /elseなどを使用することを検討することをお勧めサンプルコードの複数のIDを保持しません。値は各ループで上書きされるため、ループが終了すると最後の値だけが保存されます。

友人のユーザIDにユーザテーブルに友情のテーブルを結合して、クエリで友達の名前を取得します。ここでは

SELECT name 
    FROM friendship 
    JOIN user ON friendship.friend=user.id 
    WHERE friendship.user=? 

、私は "として「メンバー1」と「member2」列の名前を変更しました「ユーザー」と「友人」の両方が表示されます。友情を対称的な関係にしたい場合は、これを確実にするためのトリガーを追加します。いくつかのDBの拡張子(例:PDO)はサポートしていないこと

SELECT name 
    FROM friendship 
    JOIN user ON friendship.member1=user.id OR friendship.member2=user.id 
    WHERE (friendship.member1=:id OR friendship.member2=:id) 
    AND NOT user.id=:id 

注:代わりに、あなたは現在の列名を維持したいと、それはとてもユーザーと友人はどちらかの列にすることができている場合、それはメシエが、可能です同じ名前の複数の名前付きパラメータを使用するので、実際には繰り返し引数を持つ位置パラメータを使用する必要があります。ほんの少数の結果が存在する場合、(例えば)を使用して配列として名前をフェッチ

PDOStatement::fetchAll

try { 
    $friendQuery = $db->prepare('...'); 
    $friendQuery->execute(array($user->id, ...)); 
    $friends = $friendQuery->fetchAll(PDO::FETCH_COLUMN, 0); 
    switch (count($friends)) { 
    case 0: 
     // How sad. 
     $message = "You have no friends."; 
     break; 
    case 1: 
     $message = $friends[0] . ' is your friend.'; 
    default: 
     $last = array_pop($friends); 
     $message = implode(', ', $friends) . " and $last are your friends."; 
     break; 
    } 
} catch (PDOException) { 
    ... 
} 

例は例としてのみ意図されていることを注意しなく完全なソリューション。実動コードでは、データベースアクセスを扱う部分は、アプリケーションロジックと出力を処理する部分(たとえば、switch文)とは別にしておく必要があります。

0

が広く使用アレー

<?php 
#you can have array of friends like this 

$a1=array(2=>1,3=>1,5=>1,4=>1); 

#perticular user's frieds array 

$a2=array(2=>1,3=>1,5=>1); 

$final_array=array_intersect($a1,$a2)); 
if(count($final_array) > 0) 
{ 
    # each friend in $final_array are frieds Implode names here 
} 
else 
{ 
    # Not Friend 
} 
?> 

はちょうど私がdo.Youへの道をexplaindされているコードがわからないと思うと、PHPの配列関数は明らか

関連する問題