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

如何实现特定帖子下显示专属评论?PHP+MySQL技术求助

解决评论与帖子绑定的问题,让每个帖子只显示自己的评论

嘿,我来帮你搞定这个问题!你猜的完全没错——核心问题就是评论没有和具体帖子绑定:你现在的代码里,不管提交哪个帖子的评论,都没把帖子ID存进comments表的post_fk字段;查询评论时也没按帖子ID过滤,所以所有评论会一股脑显示在每篇帖子下面。咱们一步步修改:


第一步:给评论表单添加「当前帖子ID」的隐藏字段

在blog.php的帖子循环里,每个评论表单都要加一个隐藏输入框,把当前帖子的id传递给后端。还要修正你表单里的小错误:method='posts'应该是method='post'。

修改后的表单代码:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="uid" value="Anonymous">
    <input type="hidden" name="date" value="<?php echo date('Y-m-d H:i:s'); ?>">
    <!-- 新增:传递当前帖子ID -->
    <input type="hidden" name="post_id" value="<?php echo $row['id']; ?>">
    <textarea name="message" placeholder="写下你的评论..."></textarea><br>
    <button type="submit" name="commentSubmit">Comment</button>
</form>

第二步:修改setComments函数,插入评论时绑定帖子ID

原来的插入语句没把post_fk字段存进去,现在要把表单传过来的post_id写入数据库。重点:一定要用预处理语句防止SQL注入,你之前的代码有安全隐患,咱们一起修正:

function setComments($conn) {
    if (isset($_POST['commentSubmit'])) {
        // 获取表单数据
        $uid = $_POST['uid'];
        $date = $_POST['date'];
        $message = $_POST['message'];
        $post_id = $_POST['post_id']; // 拿到当前帖子ID

        // 使用预处理语句,避免SQL注入
        $sql = "INSERT INTO comments (uid, date, message, post_fk) VALUES (?, ?, ?, ?)";
        $stmt = mysqli_prepare($conn, $sql);
        // 绑定参数:s=字符串,i=整数(对应字段类型)
        mysqli_stmt_bind_param($stmt, "sssi", $uid, $date, $message, $post_id);
        mysqli_stmt_execute($stmt);
    }
}

第三步:修改getComments函数,只查询当前帖子的评论

原来的查询语句没有按帖子ID过滤,现在要给函数加一个$post_id参数,只加载对应帖子的评论,同样用预处理保证安全:

function getComments($conn, $post_id) {
    // 只查询当前帖子的评论,按时间倒序排列
    $sql = "SELECT uid, date, message FROM comments WHERE post_fk = ? ORDER BY date DESC";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "i", $post_id);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);

    // 输出评论,用htmlspecialchars防止XSS攻击
    while ($row = mysqli_fetch_assoc($result)) {
        echo "<div style='border:1px solid #eee; padding:10px; margin:10px 0;'>";
        echo "<strong>" . htmlspecialchars($row['uid']) . "</strong>";
        echo "<small style='color:#666; margin-left:10px;'>" . htmlspecialchars($row['date']) . "</small><br>";
        echo "<p>" . htmlspecialchars($row['message']) . "</p>";
        echo "</div>";
    }
}

第四步:在blog.php里正确调用getComments

循环里调用getComments时,要把当前帖子的id传进去,这样每个帖子只会加载自己的评论:

<?php
$sql = "SELECT * FROM posts ORDER BY id DESC";
$result = mysqli_query($conn,$sql);
while ($row = mysqli_fetch_array($result)) {
    $post_id = $row['id'];
    $title = $row['title'];
    $subtitle = $row['subtitle'];
    $content = $row['content'];
?>
<h2><?php echo htmlspecialchars($title); ?> - <small><?php echo htmlspecialchars($subtitle); ?></small></h2>
<p><?php echo htmlspecialchars($content); ?></p>

<!-- 上面修改后的评论表单 -->
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="uid" value="Anonymous">
    <input type="hidden" name="date" value="<?php echo date('Y-m-d H:i:s'); ?>">
    <input type="hidden" name="post_id" value="<?php echo $post_id; ?>">
    <textarea name="message" placeholder="写下你的评论..."></textarea><br>
    <button type="submit" name="commentSubmit">Comment</button>
</form>

<!-- 传递当前帖子ID给getComments -->
<?php getComments($conn, $post_id); ?>
<?php } ?>

额外的小建议

  1. 在blog.php的最顶部调用setComments,逻辑更清晰:

    <?php
    // 页面加载时先处理评论提交
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        setComments($conn);
    }
    ?>
    

    这样表单的action可以直接留空,不用写action="<?php echo setComments($conn); ?>"。

  2. 永远用htmlspecialchars转义用户输入的内容,防止XSS攻击(上面的代码已经加了)。

内容的提问来源于stack exchange,提问作者Sooty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:49