Проблема
Я пытаюсь создать сайт, на котором пользователи могут публиковать сообщения, а затем их друзья могут видеть эти сообщения. Подобно 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 ([] =>)
Спасибо за ваш ответ! Если я это сделаю, я могу просто увидеть свои собственные сообщения. – Schwesi
Вы добавили оператор 'IN' в свой SQL и что такое $ friendsSQL значение? – faltay
Я обновил свой вопрос! Спасибо вам большое за вашу помощь! – Schwesi