如何实现特定帖子下显示专属评论?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 } ?>
额外的小建议
在
blog.php的最顶部调用setComments,逻辑更清晰:<?php // 页面加载时先处理评论提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { setComments($conn); } ?>这样表单的
action可以直接留空,不用写action="<?php echo setComments($conn); ?>"。永远用
htmlspecialchars转义用户输入的内容,防止XSS攻击(上面的代码已经加了)。
内容的提问来源于stack exchange,提问作者Sooty
相关产品推荐
相关产品推荐

