PHP MySQL实现:查询并显示单表存在另一表不存在的数据
没问题,我来帮你实现这个需求。首先我们先明确核心逻辑:要找出当前用户(viewer_id)点赞过,但原评论已经从comments表中被删除的记录,然后用PHP完成查询和展示。
第一步:明确表结构(基于常见设计假设)
先确认两张表的核心字段,如果你的表结构和下面不一致,调整SQL和代码中的字段名即可:
comments(评论表):comment_id:评论唯一ID(主键)UID:发布评论的用户IDcontent:评论内容created_at:评论创建时间
comments_liked(点赞记录表):like_id:点赞记录唯一ID(主键)viewer_id:点赞用户IDcomment_id:关联的评论IDliked_at:点赞时间
第二步:编写SQL查询语句
我们用**左连接(LEFT JOIN)**来关联两张表,筛选出comments表中匹配不到对应评论的点赞记录(也就是评论已被删除的情况):
SELECT cl.like_id, cl.viewer_id, cl.comment_id, cl.liked_at FROM comments_liked cl LEFT JOIN comments c ON cl.comment_id = c.comment_id WHERE cl.viewer_id = ? -- 传入当前查看资料的viewer_id AND c.comment_id IS NULL;
这里用占位符?是为了防止SQL注入,一定要用预处理语句执行。
第三步:PHP实现查询与展示
下面用PDO(推荐,更安全且兼容性好)来实现完整功能,包含数据库连接、查询、结果展示和错误处理:
<?php // 数据库连接配置,替换成你的实际参数 $dbHost = 'localhost'; $dbName = 'your_database_name'; $dbUser = 'your_db_username'; $dbPass = 'your_db_password'; try { // 初始化PDO连接,设置字符集和错误模式 $pdo = new PDO( "mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 获取当前查看资料的用户ID(这里假设从会话获取,你可以根据实际场景调整,比如URL参数) // 注意:要做合法性校验,防止非法值 $viewerId = isset($_SESSION['viewer_id']) ? (int)$_SESSION['viewer_id'] : 0; if ($viewerId <= 0) { echo "<p>无效的用户ID</p>"; exit; } // 准备并执行SQL语句 $sql = "SELECT cl.like_id, cl.viewer_id, cl.comment_id, cl.liked_at FROM comments_liked cl LEFT JOIN comments c ON cl.comment_id = c.comment_id WHERE cl.viewer_id = ? AND c.comment_id IS NULL"; $stmt = $pdo->prepare($sql); $stmt->execute([$viewerId]); // 获取所有匹配的记录 $deletedLikedComments = $stmt->fetchAll(PDO::FETCH_ASSOC); // 展示结果 if (!empty($deletedLikedComments)) { echo "<h3>你点赞过但已被删除的评论</h3>"; echo "<div class='deleted-comments-list'>"; foreach ($deletedLikedComments as $comment) { echo "<div class='comment-item'>"; echo "<span>评论ID:{$comment['comment_id']}</span>"; echo "<span>点赞时间:" . date('Y-m-d H:i:s', strtotime($comment['liked_at'])) . "</span>"; echo "</div>"; } echo "</div>"; } else { echo "<p>你还没有点赞过已被删除的评论</p>"; } } catch (PDOException $e) { // 捕获数据库错误,生产环境建议不要直接输出错误信息,而是记录日志 echo "<p>系统错误,请稍后重试</p>"; error_log("Database Error: " . $e->getMessage()); } // 关闭连接(PDO会在脚本结束时自动关闭,可省略) $pdo = null; ?>
关键注意事项
- 防SQL注入:必须使用预处理语句(
prepare+execute),绝对不要直接把用户ID拼进SQL字符串里。 - 用户ID校验:获取
viewer_id后要做合法性校验,确保是正整数,避免非法请求。 - 软删除场景:如果你的
comments表用的是软删除(比如加了is_deleted字段标记删除),那SQL中的AND c.comment_id IS NULL要改成AND c.is_deleted = 1。 - 字符集设置:连接数据库时指定
utf8mb4字符集,支持所有Unicode字符(包括emoji)。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

