在select查询中使用变量

时间:2015-02-26 12:41:20

标签: php mysql pdo

问题
我正在尝试创建一个网站,用户可以发布帖子,然后他们的朋友可以看到这些帖子。与facebook,twitter等相似 我达到了用户可以成为朋友并且可以发布内容的程度。但是,我坚持将显示的帖子限制在用户的朋友帖子中。目前,每个用户都可以看到每个帖子 我在MVC架构中使用PDO。

数据库结构

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


在上面的代码中,我的问题在于$ friends变量。如果我用我朋友的user_id手动替换它,它按预期工作 E.g:

"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查询,它只选择由我自己或我的朋友发布的帖子,而不选择任何其他帖子。

如果有人可以帮我解决这个问题,我将非常感激!




更新
我的模型现在看起来像这样:

    /**
     * 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();
    }


这是我的输出:

  

数组([0] =&gt; stdClass对象([user_one] =&gt; 1))

     

注意:未定义的属性:stdClass :: $ key

     

注意:未定义的属性:stdClass :: $ val

     

数组([] =&gt;)

3 个答案:

答案 0 :(得分: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)");

答案 1 :(得分: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       
    )
) 

我在this帖子中提供了有关从PDO语句返回数据的更多信息。

答案 2 :(得分:-1)

你的$ friends变量由fetchAll()函数返回,因此可能是结果列表。然后,您将该列表用作查询中的字符串,但不会起作用。您需要从$ friends列表中提取朋友的ID。

如果你正在使用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();