php实现关注功能
实现关注功能的基本思路
关注功能通常涉及用户之间的互动,例如用户A关注用户B。需要设计数据库表结构、处理关注与取消关注的逻辑,并在前端展示关注状态。
数据库表设计
创建一个名为 user_follows 的表,用于存储用户之间的关注关系:
CREATE TABLE user_follows (
follower_id INT NOT NULL,
following_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (follower_id, following_id),
FOREIGN KEY (follower_id) REFERENCES users(id),
FOREIGN KEY (following_id) REFERENCES users(id)
);
follower_id:关注者的用户IDfollowing_id:被关注者的用户IDcreated_at:关注时间
关注操作实现
在PHP中处理关注请求,检查是否已关注,若未关注则插入记录:
<?php
// 假设用户已登录,当前用户ID存储在 $_SESSION['user_id']
$followerId = $_SESSION['user_id'];
$followingId = $_POST['following_id']; // 从表单或AJAX请求获取
// 检查是否已关注
$stmt = $pdo->prepare("SELECT COUNT(*) FROM user_follows WHERE follower_id = ? AND following_id = ?");
$stmt->execute([$followerId, $followingId]);
$isFollowing = $stmt->fetchColumn();
if (!$isFollowing) {
// 执行关注操作
$stmt = $pdo->prepare("INSERT INTO user_follows (follower_id, following_id) VALUES (?, ?)");
$stmt->execute([$followerId, $followingId]);
echo "关注成功";
} else {
echo "已关注";
}
?>
取消关注操作实现
处理取消关注请求,删除对应的关注记录:

<?php
$followerId = $_SESSION['user_id'];
$followingId = $_POST['following_id'];
// 执行取消关注操作
$stmt = $pdo->prepare("DELETE FROM user_follows WHERE follower_id = ? AND following_id = ?");
$stmt->execute([$followerId, $followingId]);
if ($stmt->rowCount() > 0) {
echo "取消关注成功";
} else {
echo "未关注该用户";
}
?>
检查关注状态
在页面加载时检查当前用户是否已关注目标用户:
<?php
$followerId = $_SESSION['user_id'];
$followingId = $targetUserId; // 要查看的用户ID
$stmt = $pdo->prepare("SELECT COUNT(*) FROM user_follows WHERE follower_id = ? AND following_id = ?");
$stmt->execute([$followerId, $followingId]);
$isFollowing = $stmt->fetchColumn();
if ($isFollowing) {
echo '<button class="unfollow-btn" data-user-id="'.$followingId.'">已关注</button>';
} else {
echo '<button class="follow-btn" data-user-id="'.$followingId.'">关注</button>';
}
?>
前端交互实现
使用AJAX处理关注/取消关注操作,无需刷新页面:

// 关注按钮点击事件
$(document).on('click', '.follow-btn', function() {
const userId = $(this).data('user-id');
$.post('follow.php', { following_id: userId }, function(response) {
if (response === "关注成功") {
$(this).text('已关注').removeClass('follow-btn').addClass('unfollow-btn');
}
});
});
// 取消关注按钮点击事件
$(document).on('click', '.unfollow-btn', function() {
const userId = $(this).data('user-id');
$.post('unfollow.php', { following_id: userId }, function(response) {
if (response === "取消关注成功") {
$(this).text('关注').removeClass('unfollow-btn').addClass('follow-btn');
}
});
});
获取关注列表
查询某个用户的关注列表(他关注的人):
<?php
$userId = $_GET['user_id']; // 要查询的用户ID
$stmt = $pdo->prepare("
SELECT u.id, u.username, u.avatar
FROM user_follows f
JOIN users u ON f.following_id = u.id
WHERE f.follower_id = ?
");
$stmt->execute([$userId]);
$followingList = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($followingList as $user) {
echo '<div class="user-item">';
echo '<img src="'.$user['avatar'].'" alt="'.$user['username'].'">';
echo '<span>'.$user['username'].'</span>';
echo '</div>';
}
?>
获取粉丝列表
查询某个用户的粉丝列表(关注他的人):
<?php
$userId = $_GET['user_id'];
$stmt = $pdo->prepare("
SELECT u.id, u.username, u.avatar
FROM user_follows f
JOIN users u ON f.follower_id = u.id
WHERE f.following_id = ?
");
$stmt->execute([$userId]);
$followerList = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($followerList as $user) {
echo '<div class="user-item">';
echo '<img src="'.$user['avatar'].'" alt="'.$user['username'].'">';
echo '<span>'.$user['username'].'</span>';
echo '</div>';
}
?>
性能优化建议
对于大型社交平台,关注功能可能需要考虑以下优化:
使用缓存存储用户的关注关系,减少数据库查询 对关注/取消关注操作实现队列处理,避免高并发时数据库压力过大 考虑使用Redis等内存数据库存储活跃用户的关注关系 实现分页查询关注列表和粉丝列表,避免一次性加载大量数据





