PHP PDO如何在我的用户列表旁边显示我关注的人?

时间:2013-06-05 12:55:47

标签: php mysql arrays pdo foreach

我正在家里做一个项目来自学PHP PDO。我的项目是从头开始创建twitter的基本版本。但我被卡住了。我想要做的是显示一个用户列表(按ID排序),我可以做得很好,但除了我想要显示当前登录用户是否跟随该人的用户列表旁边,我可以显示一个链接以关注或取消关注它们。从我所看到的,这真的是关于数组和foreach循环的问题。

数据库中的相关两个表看起来像这样(带有示例数据):

用户:
    id |用户名
    1 |乔希
    2 |山姆
    3 |简

以下:
    user_id | follower_id
         2 | 1
         3 | 1个

例如,当前登录的用户Josh(id为1)跟随Sam(id为2)。然后,下面的数据库行将跟随follower_id 1,user_id 2。

我写了两个函数来显示我所有用户的ID和用户名,另一个用来显示当前登录的用户是谁。他们在这里:

    function show_users(){
        $sql = "select id, username from users order by id";
        $stmt = $GLOBALS['db']->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);        
        return $result;
    }

    function check_follow($userid){
        $sql= "SELECT DISTINCT user_id FROM following WHERE follower_id = '$userid' ";
        $stmt = $GLOBALS['db']->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

如果我只想显示按ID排序的用户列表,这一切都正常。

但我想要做的是在用户列表旁边显示一个列,显示您是否正在关注该人,即提供“关注”或“取消关注”他们的链接。

目前,我页面的相关部分如下所示:

<?php

$userid = $_SESSION['user']['id'];
$following = check_follow($userid);
$rows = show_users();

?> 

<h1>Follow list</h1> 
<table> 
    <tr> 
        <th>id</th> 
        <th>Username</th>
        <th>Follow status</th> 
    </tr> 
<?php foreach($rows as $row): ?> 
    <tr> 
        <td><?php echo $row['id']; ?></td> 
        <td><?php echo $row['username']; ?></td>
        <td><?php 
            if (in_array($following, $rows)){
                echo "<a href='#'>unfollow</a>";
            }else{
                echo "<a href='#'>follow</a>"; } ?>
    </td> 
    </tr> 
    <?php endforeach; ?> 
</table>

一切正常(除了我/我不参与的节目),它没有显示某些人的“关注”链接和其他人的“取消关注”链接!

我花了好几个小时。我已经阅读了有关输出不同数据的数组,foreach,in_array,PDO fetch语句和教程,但没有任何帮助。它并没有帮助大多数东西都是非pdo。

SOS:)

2 个答案:

答案 0 :(得分:1)

您不希望循环遍历一个结果集,然后对每一行进行查询。效率低下,数据库可以为您完成。

尝试加入查询:

SELECT u.id, u.username, IF(f.follower_id IS NULL, 0, 1) as following
FROM users u
LEFT JOIN following f
  ON u.id = f.user_id
  AND f.follower_id = $loggedinuser

LEFT JOIN为users表中的每一行提供符合“ON”子句中条件的以下任何行。如果没有匹配项,则在结果中将这些列设置为NULL。

答案 1 :(得分:0)

您现在正在为一个结果执行两个不同的查询。

你应该加入你的“跟随”表格,就像这样

        SELECT 
        `Users`.`userid` as `Users.id`,
        `Followers`.`id` as `Followers.id`
    FROM 
        `users` AS `Users"` 
    LEFT JOIN 
        `followers` AS `Followers` ON (`Users`.`id` = `Followers`.`userid`) 

然后,您将获得属于同一数据集的特定用户的关注者,属于用户ID,然后您可以检查您的用户ID是否出现在数组中,或者您甚至可以进一步添加子串你现有的查询,但是你必须阅读它,在你这样做之前你应该理解它。