PHP/SQL技术实现:检测用户是否已点赞帖子,是则取消点赞
嘿,我来帮你搞定这个点赞/取消点赞的功能!结合你现有的Likes表和Like.class.php类,我们只需要补充几个关键方法,再整合逻辑就能实现需求。
实现步骤
1. 给Like.class.php补充核心方法
首先需要在你的类里新增两个方法:一个检测用户是否已点赞,一个执行取消点赞操作。
检测是否已点赞:isLiked($postId)
这个方法会根据当前登录用户ID和目标帖子ID,查询Likes表是否存在对应记录:
public function isLiked($postId) { // 假设你的类已持有数据库连接实例(比如$this->db) // 从会话中获取当前登录用户ID,根据你的实际认证方式调整 $userId = $_SESSION['user_id']; $sql = "SELECT 1 FROM Likes WHERE user_id = :user_id AND post_id = :post_id LIMIT 1"; $stmt = $this->db->prepare($sql); $stmt->bindParam(':user_id', $userId, PDO::PARAM_INT); $stmt->bindParam(':post_id', $postId, PDO::PARAM_INT); $stmt->execute(); // 存在记录则返回true(已点赞),否则返回false return $stmt->rowCount() > 0; }
取消点赞:unlike($postId)
这个方法负责删除用户对目标帖子的点赞记录:
public function unlike($postId) { $userId = $_SESSION['user_id']; $sql = "DELETE FROM Likes WHERE user_id = :user_id AND post_id = :post_id"; $stmt = $this->db->prepare($sql); $stmt->bindParam(':user_id', $userId, PDO::PARAM_INT); $stmt->bindParam(':post_id', $postId, PDO::PARAM_INT); // 返回删除操作是否成功执行 return $stmt->execute(); }
2. 业务逻辑整合(调用示例)
现在你可以在业务代码里调用这些方法,实现“检测-判断-执行”的完整流程:
// 实例化Like类 $likeHandler = new Like(); $targetPostId = $_GET['post_id']; // 替换为实际的帖子ID来源 // 核心逻辑:判断并执行对应操作 if ($likeHandler->isLiked($targetPostId)) { // 已点赞,执行取消 $likeHandler->unlike($targetPostId); echo "已取消点赞"; // 前后端分离场景建议返回JSON:echo json_encode(['status' => 'success', 'action' => 'unliked']); } else { // 未点赞,执行添加点赞(用你已有的Addlike方法) $likeHandler->Addlike($targetPostId); echo "已点赞"; // 前后端分离场景建议返回JSON:echo json_encode(['status' => 'success', 'action' => 'liked']); }
额外优化建议
- 数据库层面防重复:给
Likes表添加user_id和post_id的联合唯一索引,这样能从根源避免同一个用户重复点赞同个帖子,即使代码层面有疏漏也能保证数据一致性。 - 安全注意:不要直接使用用户提交的
user_id,一定要从可信的来源(比如会话、认证令牌)获取,防止SQL注入或越权操作。 - 状态同步:如果是前端交互场景,执行操作后要同步更新页面上的点赞按钮状态和点赞数,提升用户体验。
内容的提问来源于stack exchange,提问作者Zanic L3
相关产品推荐
相关产品推荐

