1

データベース:

  • xx_users(id、name、user_id、email、location)
  • xx_questions(id、question、description、user_id)

元のコード:

$friends = $facebook->api('/me/friends');
$arr= $friends['data'];
$friend_ids_arr = array();
foreach($arr as $friend) {
    $friend_ids_arr[] = $friend['id'];
}

$sql = "SELECT * FROM xx_questions WHERE user_id IN (" . implode(',', $friend_ids_arr) . ") OR user_id = '$user' ORDER BY time DESC";

新しいコード:

$friends = $facebook->api('/me/friends');
$arr= $friends['data'];
$friend_ids_arr = array();
foreach($arr as $friend) {
    $friend_ids_arr[] = $friend['id'];
}
    $sql = "SELECT *
    FROM xx_questions q JOIN xx_users u ON
        q.user_id = u.user_id
    WHERE q.user_id IN (implode(',', $friend_ids_arr)) OR // STEP 1
        q.user_id = '$user' OR // STEP 2
        u.location = (SELECT location FROM xx_users WHERE user_id = $user) // STEP 3
    ORDER BY q .time DESC";

    $data = mysql_query($sql) or die(mysql_error());
    while ($row = mysql_fetch_assoc($data)) {
        echo $row[id];
        }

次の3つの状況のいずれかが発生した場合に、xx_questions(ユーザーによって投稿されたもの)から質問を選択しようとしています。

  1. ポスターのuser_idが現在のユーザーの友達の1人の値と一致する値(つまり、ポスターとユーザーは友達です)
  2. ポスターのuser_idがユーザーの値と一致する値(つまり、ポスターがユーザー)
  3. ポスターの場所が現在のユーザーの場所と一致する値(つまり、ポスターとユーザーが現在同じ都市にいる)

私は元々ステップ1と2を達成していましたが、ステップ3を追加すると、次の2つのことが起こります。

  1. ステップ1が機能しなくなります(つまり、現在のユーザーからの投稿と同じ都市の人々のみが返されます)
  2. whileループでエコーされるの$row[id]は、xx_questionsではなくxx_usersのエコーです。私は試しまし$row[q.id]たが、役に立ちませんでした。

何がうまくいかなかったのか分かりますか?

4

1 に答える 1

2

秒のクエリでは、implode ステートメントは文字列の外側にありません。

"WHERE q.user_id IN (implode(',', $friend_ids_arr)) OR" // STEP 1

PHP は二重引用符で囲まれた文字列に変数を追加できますが ( $x = "test $test test"$test は $test の値に変更されます)、関数をエスケープすることはできません。したがって、これは

"WHERE q.user_id IN (implode(',', Array)) OR" // STEP 1

以下を使用する必要があります。

"WHERE q.user_id IN (".implode(',', $friend_ids_arr).") OR" // STEP 1

そして最後に使用してSELECT *いて、両方のテーブルに Id 列がある場合、1 つだけが返されます。SELECT q.*質問行のみを取得するか、質問行SELECT q.*, u.location全体とユーザー テーブルから場所を取得するために使用することをお勧めします。

私もあなたのクエリをチェックしましたが、それはあなたが望むことをするはずです

$sql = "SELECT q.*, u.location
            FROM xx_questions q 
            JOIN xx_users u 
            ON q.user_id = u.user_id
            WHERE q.user_id IN (".implode(',', $friend_ids_arr).") OR // STEP 1
            q.user_id = $user OR // STEP 2
            u.location = (SELECT location FROM xx_users WHERE user_id = $user) // STEP 3
            ORDER BY q.time DESC";

私が変更した唯一のことは、implode周囲の '' を削除すること$userです。これは、$user が実際には整数ではなく、数値を含む文字列であるが、いくつかの余分なスペースが追加されている場合です (たとえば、'1' の代わりに '1')。

于 2012-12-18T11:08:48.240 に答える