社交网站探索页Bug排查:按unfollowed字段筛选帖子异常
解决探索页面帖子屏蔽逻辑的Bug
看起来你这段代码的问题出在几个关键的逻辑错误上,我来一步步拆解并修复:
问题根源分析
- 查询字段完全错误:你要找的是被当前用户屏蔽的用户(也就是
user_to,因为user_from是当前登录用户),但你的查询却选了user_from,结果拿到的全是当前用户自己的ID。 - 循环覆盖变量:你在循环里每次把
$user_following替换成当前行的user_from,最后这个变量只会保留最后一条记录的值——也就是你自己的ID。 - 错误的条件判断:最后你拿
$userLoggedIn和$user_following(也就是你自己)比较,结果永远为真,直接触发die('No explore posts to show.'),这就是为什么只要有一条相关记录,页面就完全不显示帖子。
修复后的代码实现
首先,我们要先收集所有被当前用户屏蔽的用户ID,然后在查询帖子时排除这些用户的内容:
// 1. 获取所有被当前用户屏蔽的用户ID(unfollowed=0的user_to) $blocked_users = []; $blocked_query = $con->prepare('SELECT user_to FROM following WHERE user_from = ? AND unfollowed = 0'); $blocked_query->bind_param("s", $userLoggedIn); $blocked_query->execute(); $result = $blocked_query->get_result(); while ($row = $result->fetch_assoc()) { $blocked_users[] = $row['user_to']; } $blocked_query->close(); // 2. 构建帖子查询语句,排除被屏蔽用户的内容 $posts_query = "SELECT * FROM posts WHERE 1=1"; if (!empty($blocked_users)) { // 把数组转成逗号分隔的字符串,同时处理SQL注入风险 $blocked_ids = implode(',', array_map(function($id) use ($con) { return $con->real_escape_string($id); }, $blocked_users)); $posts_query .= " AND user_id NOT IN ($blocked_ids)"; } // 执行帖子查询 $posts_result = $con->query($posts_query); // 3. 渲染帖子或无内容提示 if ($posts_result->num_rows === 0) { echo 'No explore posts to show.'; } else { while ($post = $posts_result->fetch_assoc()) { // 这里替换成你的帖子渲染逻辑 echo "<div class='post-item'>{$post['content']}</div>"; } }
逻辑说明
- 先从
following表中获取所有当前用户标记为unfollowed=0的user_to(被屏蔽用户),存入数组。 - 查询帖子时,如果有被屏蔽用户,就用
NOT IN排除这些用户的内容;如果没有被屏蔽用户,就正常查询所有帖子。 - 最后根据帖子查询结果判断是否显示“无帖子”提示,替代了原来错误的用户ID比较逻辑。
这样就能完美实现你的需求:
- 当存在
user_from=$userLoggedIn且unfollowed=0的记录时,屏蔽对应user_to的帖子; - 当
unfollowed=1或无对应记录时,正常显示帖子。
内容的提问来源于stack exchange,提问作者Brandon T
相关产品推荐
相关产品推荐

