2016-08-16 1 views
1

Я построил Twitter как следующую систему с использованием PHP и Mysql, и я хотел бы указать последователей, которые пользователь имеет в порядке, в котором они следовали за пользователем. Существуют две реляционные таблицы, которые относятся к этому действию: USERS и FOLLOW.Как отобразить в определенном порядке набор результатов из одной таблицы MySQL на основе другого параметра таблицы

user_id тот, за которым следуют.

follow_id тот, который следующий.

created дата, в которой произошло следующее.

FOLLOW

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

ПОЛЬЗОВАТЕЛЕЙ

-------------------------------------------------- 
|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; 
    } 
} 

?> 

Код для Dislay последователей

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

foreach($followers as $follower){ 

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

В настоящее время список последователей заказывается по созданию, на котором были созданы пользователи, и я хотел бы, чтобы отобразить их на основании, когда порядок, в котором они последовали за пользователем. Как это может быть сделано?

Заранее благодарен!

+1

Здесь вы используете какую-то инфраструктуру, которая предоставляет 'find_by_sql', но неясно, какой из них. Вы также создаете запросы с помощью [SQL injection bugs] (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/ ru/pdo.prepared-statements.php), где любые предоставленные пользователем данные указываются с индикатором '?' или ': name', который позже заполняется с помощью' bind_param' или 'execute' в зависимости от того, какой из них вы используете. – tadman

ответ

1

Вы можете использовать соединение на двух таблицах, а затем иметь несколько вызовов в БД. 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

Спасибо человеку, что-то в запросе базы данных сломано. Msgstr "Ошибка базы данных" ... –

+0

Есть ли еще эта ошибка? – nerdlyist

+0

Невнятная ошибка с моей стороны, я не дважды проверял запрос, чтобы исправить «user.user_id» для «users.user_id», поскольку таблица называется «пользователями». Большое спасибо за вашу помощь, он отлично работает. –