2015-02-26 2 views
1

Проблема
Я пытаюсь создать сайт, на котором пользователи могут публиковать сообщения, а затем их друзья могут видеть эти сообщения. Подобно facebook, twitter и т. Д.
Я дошел до того, что пользователи могут быть друзьями, и они могут публиковать вещи. Тем не менее, я застрял, ограничивая показанные сообщения только сообщениями друзей пользователя. В настоящий момент каждый пользователь может видеть каждый пост.
Я использую PDO в архитектуре MVC.

Использование переменной в выбранном запросе

Структура базы данных

TABLE `friends` (
    `friendship_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_one` int(11) NOT NULL, 
    `user_two` int(11) NOT NULL, 
    PRIMARY KEY (`friendship_id`), 
    FOREIGN KEY (user_one) REFERENCES users(user_id), 
    FOREIGN KEY (user_two) REFERENCES users(user_id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


В таблице выше, в зависимости от того, кто послал запрос на друга, кто, «user_one» может быть либо себе или мой друг или «user_two» может быть я или мой друг.

TABLE `posts` (
`post_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`post_text` text NOT NULL, 
`user_id` int(11) unsigned NOT NULL, 
PRIMARY KEY (`post_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


Модель

/** 
    * Get all posts from the suer's friends 
    * @return array an array with several objects (the posts) 
    */ 
    public static function getAllPosts() 
    { 
     $my_id = Session::get('user_id'); 

     $database = DatabaseFactory::getFactory()->getConnection(); 

     // get all of the user's friends 
     $friendsQuery = $database->prepare(" 
            SELECT user_one FROM friends WHERE user_two = '$my_id'; 
            SELECT user_two FROM friends WHERE user_one = '$my_id'; 
            "); 

     $friendsQuery->execute(); 
     $friends = $friendsQuery->fetchAll(); 
     $friendsQuery->closeCursor(); 

     $query = $database->prepare("SELECT * FROM posts WHERE user_id = '$my_id' OR user_id = '$friends'"); 
     $query->execute(array()); 

     return $query->fetchAll(); 
    } 


В приведенном выше коде моя проблема заключается в $ друзей переменной. Если я заменил его вручную с user_id моего друга, он будет работать по назначению.
т.д .:

"SELECT * FROM posts WHERE user_id = '$my_id' OR user_id = '1'"; 

Контроллер

/** 
    * Gets all posts (of the user and his friends). 
    */ 
    public function index() 
    { 
     $this->View->render('post/index', array(
      'posts' => PostModel::getAllPosts() 
     )); 
    } 

Взгляд

 <?php if ($this->posts) { ?> 
      <?php foreach($this->posts as $key => $value) { ?> 
       <p><?= htmlentities($value->post_text); ?></p> 
      <?php } ?> 
     <?php } ?> 


Резюме
Я не могу создать sql-запрос, который просто выбирает сообщения, которые были отправлены мной или моими друзьями, и не выбирает никаких других сообщений.

Я был бы очень благодарен, если бы кто-нибудь мог помочь мне с этим!




UPDATE
Моя модель теперь выглядит следующим образом:

/** 
    * Get all posts from the suer's friends 
    * @return array an array with several objects (the posts) 
    */ 
    public static function getAllPosts() 
    { 
     $my_id = Session::get('user_id'); 

     $database = DatabaseFactory::getFactory()->getConnection(); 

     // get all of the user's friends 
     $friendsQuery = $database->prepare(" 
            SELECT user_one FROM friends WHERE user_two = '$my_id'; 
            SELECT user_two FROM friends WHERE user_one = '$my_id'; 
            "); 

     $friendsQuery->execute(); 
     $friends = $friendsQuery->fetchAll(); 
     print_r($friends); 
     $friendsQuery->closeCursor(); 

     foreach($friends as $friend) 
     { 
      $friend_ids[$friend->key] = $friend->val; 
     } 
     print_r($friend_ids); 
     $friendsSQL = implode(',',$friend_ids); 

     $query = $database->prepare("SELECT * FROM posts WHERE user_id = '$my_id' OR user_id IN('$friendsSQL')"); 
     $query->execute(); 

     return $query->fetchAll(); 
    } 


Это мой выход:

Array ([0] => StdClass Object ([user_one] => 1))

Примечание: Не определено свойство: StdClass :: $ ключ

Примечание: Не определено свойство: StdClass :: $ Вэл

Array ([] =>)

ответ

2

Вы можете добавить все friends_id в массив, а затем использовать этот код.

//$friends is an array. 
$friendsSQL = implode(',',$friends); 
$query = $database->prepare("SELECT * FROM posts WHERE user_id = '$my_id' OR user_id IN($friendsSQL)"); 
+0

Спасибо за ваш ответ! Если я это сделаю, я могу просто увидеть свои собственные сообщения. – Schwesi

+0

Вы добавили оператор 'IN' в свой SQL и что такое $ friendsSQL значение? – faltay

+0

Я обновил свой вопрос! Спасибо вам большое за вашу помощь! – Schwesi

1

Следует отметить, что $friendsQuery->fetchAll() вернет массив. Кроме того, если PDO::FETCH_ASSOC поставляется в качестве дополнительного аргумента [fetchAll(PDO::FETCH_ASSOC)], это будет ассоциативный массив.

Структура массива может выглядеть следующим образом:

Array ([int] datasetNumber => 
    Array (
     [string] "friendship_id" => [int] 1, 
     [string] "user_one"  => [int] 1, 
     [string] "user_two"  => [int] 1  
    ) 
) 

Я дал больше информации о возвращении данных из PDO отчетности в this пост.

+0

Спасибо за ваш ответ! Я не уверен, как это отвечает на мой вопрос. Я могу отображать сообщения просто отлично. Проблема в том, что отображаются все сообщения, а не только мои и мои друзья. – Schwesi

+1

Вы помещаете массив в строку; что не может работать. Решение состояло бы в том, чтобы «преобразовать» массив в строку, используя запятую в качестве разделителей, как указывал в их ответе Faltay. – Tacticus

-1

Ваша переменная $ friends возвращается функцией fetchAll(), поэтому, вероятно, будет список результатов. Затем вы используете этот список в виде строки в запросе, который не будет работать. Вам нужно извлечь идентификатор друга из списка друзей.

, если вы используете PDO затем использовать переменную обработку, встроенный в PDO, т.е.:

$query = $database->prepare("SELECT * FROM posts WHERE user_id = :variable_ID OR user_id = '1'"); 
$query->bindValue(':variable_ID', $my_id, PDO::PARAM_STR ]); 
$query->execute(); 
+0

Вы имели в виду 'OR user_id = '1'' в конце вашего запроса? – Schwesi

Смежные вопросы