帖子系统代码无法正常显示评论及回复,求问题排查
排查思路与问题修复
让我帮你一步步排查评论和回复不显示的问题,你的代码里有几个明显的错误,直接导致了这个现象,咱们逐个解决:
1. 评论查询的SQL变量硬编码错误
在获取评论的SQL语句中,你不小心把postid变量写成了字符串字面量'postid',这会让SQL去查找postid字段等于字符串"postid"的记录,而不是当前帖子的真实ID:
// 错误写法 $commentsql = "SELECT * FROM posts WHERE hostid = '$hostid' AND postid = 'postid' AND commentid > 0 AND replyid = 0"; // 修正后 $commentsql = "SELECT * FROM posts WHERE hostid = '$hostid' AND postid = '$postid' AND commentid > 0 AND replyid = 0";
这是评论不显示的核心原因,改完这个后,评论查询就能匹配到正确的记录了。
2. 回复查询的变量名与函数拼写错误
处理回复的代码里有两处低级笔误,直接导致回复无法被查询和遍历:
- 变量名写错:
$replyresult = mysqli_query($conn, $repysql);这里应该是$replysql(原代码少写了字母l) - 函数名拼写错误:
myslqi_fetch_assoc($replyresult)正确的函数名是mysqli_fetch_assoc(原代码把mysqli写成了myslqi,少了字母s)
修正后的回复处理代码:
$currentcommentid = $commentrow['commentid']; $replysql = "SELECT * FROM posts WHERE hostid = '$hostid' AND postid = '$postid' AND commentid = '$currentcommentid' AND replyid > 0"; $replyresult = mysqli_query($conn, $replysql); while ($replyrow = mysqli_fetch_assoc($replyresult)) { echo ' <div class="PostReplies"> <p> '.$replyrow['reply'].' </p> </div> '; }
3. 查询结果判断的逻辑位置错误
你把mysqli_num_rows的判断放在了while循环内部,这是逻辑错误:如果查询没有结果,while循环根本不会执行,所以"There are no Comments."的提示永远不会显示。应该把行数判断移到循环外面,这样才能正确触发无评论的提示:
$commentresult = mysqli_query($conn, $commentsql); if (mysqli_num_rows($commentresult) == 0) { echo ' <p>There are no Comments.</p> '; } else { while ($commentrow = mysqli_fetch_assoc($commentresult)) { echo ' <div class="PostComments"> <p> '.$commentrow['comment'].' </p> </div> '; // 把回复处理的代码放在这里 } }
另外,回复的无结果判断可以直接去掉,因为如果没有回复,while循环不会执行,自然不会输出任何内容,刚好符合你“无回复时不输出”的需求。
额外提醒:SQL注入问题的修复(你提到已知该问题)
当前代码直接把$_GET参数拼接到SQL语句里,存在严重的SQL注入风险,必须修复。推荐使用预处理语句来处理所有包含用户输入的查询,示例如下:
比如获取用户信息的部分:
// 旧的危险写法 $usersql = "SELECT * FROM users WHERE userName = '$userName'"; $userresult = mysqli_query($conn, $usersql); // 新的安全预处理写法 $usersql = "SELECT * FROM users WHERE userName = ?"; $stmt = mysqli_prepare($conn, $usersql); mysqli_stmt_bind_param($stmt, "s", $userName); // "s"表示参数是字符串类型 mysqli_stmt_execute($stmt); $userresult = mysqli_stmt_get_result($stmt);
所有涉及$_GET、$_POST等用户输入的SQL查询,都应该用这种方式处理,彻底避免注入攻击。
把以上这些错误全部修复后,你的评论和回复应该就能正常显示了。
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

