You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL实现:查询并显示单表存在另一表不存在的数据

没问题,我来帮你实现这个需求。首先我们先明确核心逻辑:要找出当前用户(viewer_id)点赞过,但原评论已经从comments表中被删除的记录,然后用PHP完成查询和展示。

第一步:明确表结构(基于常见设计假设)

先确认两张表的核心字段,如果你的表结构和下面不一致,调整SQL和代码中的字段名即可:

  • comments(评论表):
    • comment_id:评论唯一ID(主键)
    • UID:发布评论的用户ID
    • content:评论内容
    • created_at:评论创建时间
  • comments_liked(点赞记录表):
    • like_id:点赞记录唯一ID(主键)
    • viewer_id:点赞用户ID
    • comment_id:关联的评论ID
    • liked_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:09:27