2016-08-16 11 views
1

PHPとMysqlを使用して次のようなシステムを構築しました。彼らはユーザーに従った。このアクションに関連する2つのリレーショナル・テーブルUSERSとFOLLOWがあります。別のテーブルパラメータに基づいて、特定のMySQLテーブルの結果セットを特定の順序で表示する方法

user_idフォローされているもの。

follow_id次のもの。

created次のようなことが起こった日付。特定のユーザーのためのフォロワーを取得する

FOLLOW

-------------------------------------------------- 
|user_id |follow_id | created | 
-------------------------------------------------- 
| 23  | 5  |2016-08-09 | 
-------------------------------------------------- 

USERS

-------------------------------------------------- 
|user_id | name | 
------------------------------------------------- 
| 5  |John Doe| 
-------------------------------------------------- 

このPHPのMySQL関数。

<?php 
public static function find_followers($user_id){ 
    global $database; 

    $followers_ids = array(); 
    $sql = "SELECT user_id 
      FROM follow 
      WHERE followed_id = '{$user_id}' 
      ORDER BY created"; 
    $result = $database->query($sql); 
    while($follower = $database->fetch_array($result)){ 
     array_push($followers_ids, $follower['user_id']); 
    } 
    if(count($followers_ids)){ 
     $id_strings = join(',', $followers_ids); 

     $sql = "SELECT * FROM users WHERE id IN ($id_strings)"; 
     $followers = self::find_by_sql($sql); 
     return $followers; 
    } 
} 

?> 

フォロワー

<?php 
$followers = find_followers($id); 

foreach($followers as $follower){ 

echo $follower->full_name() . "followed you.<br/>"; 
?> 

をdislayするコード現在フォロワーのリストは、ユーザーが作成された作成が発注されている、と私は時に順番に彼ら彼らがに基づいて表示したいですユーザに続いた。これはどうすればできますか?

ありがとうございます!

+1

'find_by_sql'を提供するフレームワークをここで使用していますが、どちらが明確かはわかりません。また、準備されたステートメントを使用していないため、[SQLインジェクションバグ](http://bobby-tables.com/)を使用してクエリを作成しています。あなたのフレームワークはこれを安全に行うための推奨された方法を持っているべきです。 – tadman

+0

@tadman私には単純なクラスのように見えるだけで、私たちはそれをすべて表示していません – RiggsFolly

+1

**警告**:このコードでは、おそらくいくつかの[SQLインジェクションのバグ](http://bobby-tables.com/)があります。可能な限り**準備文**を使用してください。これらは[mysqli](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と[PDO](http://php.net/manual/)で行うのはかなり簡単です。 en/pdo.prepared-statements.php)ここで、ユーザが提供するデータは '?'または ':name'のインジケータで指定され、後で' bind_param'や 'execute'を使ってデータを入力します。 – tadman

答えて

1

DBへの複数の呼び出しではなく、2つのテーブルの結合を使用できます。 SQLは次のようになります。

SELECT user.user_id, user.name /*The user that is followings details*/ 
FROM users 
JOIN follow ON user.user_id = follow.follow_id /*You want the info for follower*/ 
WHERE follow.user_id = '{$user_id}' /*Only where the user is this user*/ 
ORDER BY follow.created /*Based on question this is the date a follow happened*/ 

今、PHPは($データベースはmysqliではなく、確実であると仮定して)になることができます:

<?php 
    public static function find_followers($user_id){ 
     global $database; 

     $followers_ids = array(); 
     $sql = "SELECT user.user_id, user.name 
      FROM users 
      JOIN follow ON user.user_id = follow.follow_id 
      WHERE follow.user_id = '{$user_id}' 
      ORDER BY follow.created"; 

     //If $user_id is user input you should do a prepared statement. 
     $result = $database->query($sql); 
     $followers = $database->mysqli_fetch_all($result); 

     return $followers; 
    } 
} 

?> 

あなたのビューは、同じ滞在することができます:

<?php 
    $followers = find_followers($id); 

    foreach($followers as $follower){ 

     echo $follower->full_name() . "followed you.<br/>"; 
    } 
    ?> 
+0

ありがとう、データベースクエリの何かが壊れています。 "データベースクエリが失敗しました" ... –

+0

このエラーはもうありますか? – nerdlyist

+0

私のところで間違った誤りがありました。テーブルが 'users'と呼ばれているため、 'user.user_id'の 'user.user_id'を修正するためにクエリを再確認しませんでした。あなたの助けを借りてくれてありがとう、それは今、完璧に働いています。 –

関連する問題