PHP开发如何实现仅向单篇文章提交评论 评论同步所有文章怎么修复
问题修复方案
你的问题出在评论提交逻辑错误和评论查询未过滤当前文章ID两个环节,按以下步骤修改即可:
1. 页面开头增加当前文章ID获取逻辑
访问单篇文章页的路径应为post.php?post_id=xxx,在页面最顶部先拿到并校验当前文章ID:
// 放在页面最开头,优先获取当前文章ID $current_post_id = isset($_GET['post_id']) ? intval($_GET['post_id']) : 0; if ($current_post_id <= 0) { echo "文章不存在"; exit; }
2. 修复评论提交逻辑
原有提交逻辑存在两个错误:一是取文章ID时错误将字符串变量当数组读取,二是提交成功跳转未带文章ID,修改如下:
if(isset($_POST['create_comment'])){ // 增加内容非空校验 $comment_content = trim($_POST['comment_contents']); if (empty($comment_content)) { echo "评论内容不能为空"; exit; } $comment = $db->prepare('INSERT INTO comments SET comment_user_id=?, comment_post_id=?, comment_contents=?, created_time=NOW()'); $comment->execute(array( $user['user_id'], $current_post_id, // 直接使用已经校验过的当前文章ID $comment_content )); // 跳转时带上当前文章ID,回到对应文章页 header("Location: post.php?post_id={$current_post_id}"); exit(); }
3. 评论表单增加隐藏的文章ID字段
在<form>标签内部增加隐藏域,确保提交时传递当前文章ID:
<form action="" method="post" role="form"> <!-- 新增下面这行隐藏域 --> <input type="hidden" name="post_id" value="<?php echo $current_post_id; ?>"> <div class="form-group"> <label for="Comment">Your Comment</label> <textarea class="form-control" rows="3" name="comment_contents"></textarea> </div> <button type="submit" name="create_comment" class="btn btn-primary">Comment</button> </form>
4. 修复评论查询逻辑,增加文章ID过滤
原有查询没有过滤条件,会取出所有文章的评论,修改为仅查询当前文章的评论:
// 使用预处理查询,仅查询当前文章的评论,不需要关联posts表 $comments = $db->prepare('SELECT u.user_name, c.* FROM users u, comments c WHERE u.user_id=c.comment_user_id AND c.comment_post_id = ? ORDER BY c.created_time DESC'); $comments->execute(array($current_post_id));
额外优化建议
- 新增评论时可以额外校验当前文章是否存在,避免给不存在的文章提交评论
- 删除评论逻辑中,除了校验用户身份,建议也校验评论所属文章,避免越权操作
- 所有输出到页面的内容都已经做了
htmlspecialchars转义,有效避免XSS风险,可保持该做法
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

