我正在家里做一个项目来自学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:)
答案 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是否出现在数组中,或者您甚至可以进一步添加子串你现有的查询,但是你必须阅读它,在你这样做之前你应该理解它。