基于PHP、MySQL和HTML的博客评论区显示异常问题求助
问题分析与解决方案
你的问题核心是评论与文章的关联逻辑错误,再加上只获取了单条评论数据,才导致只有第一篇文章能显示评论。咱们一步步拆解解决:
问题根源
你的代码里先执行了:
$wyswkom = mysqli_query($polacz, "SELECT * FROM kom"); $komy = mysqli_fetch_assoc($wyswkom);
这会让$komy只存储第一条评论的数据,后续循环文章时,所有文章都只能用这条评论,而且完全没和文章ID做关联,自然其他文章找不到对应评论。
修正方案
正确逻辑应该是:循环每篇文章时,根据当前文章的ID查询对应的评论,再循环输出这些评论。假设你的news表主键是id,kom表有外键news_id关联文章ID,修正后的代码如下:
// 先查询所有文章 $wynik = mysqli_query($polacz, "SELECT * FROM news"); // 循环遍历每一篇文章 while($news = mysqli_fetch_assoc($wynik)) { echo "<h2>{$news['title']}</h2>"; // 输出文章标题 echo "<p>{$news['content']}</p>"; // 输出文章内容 // 关键步骤:根据当前文章ID查询对应评论 $komQuery = mysqli_query($polacz, "SELECT * FROM kom WHERE news_id = {$news['id']}"); // 循环输出该文章的所有评论 echo "<div class='comments-section'>"; while($komy = mysqli_fetch_assoc($komQuery)) { echo "<div class='single-comment'>"; echo "<p><strong>{$komy['comment_author']}</strong></p>"; echo "<p>{$komy['comment_content']}</p>"; echo "</div>"; } echo "</div>"; }
额外优化建议
- 为避免SQL注入风险,推荐使用预处理语句执行查询,尤其是涉及用户输入的场景:
// 预处理评论查询语句 $stmt = mysqli_prepare($polacz, "SELECT * FROM kom WHERE news_id = ?"); mysqli_stmt_bind_param($stmt, "i", $news['id']); mysqli_stmt_execute($stmt); $komQuery = mysqli_stmt_get_result($stmt);
- 确认你的
kom表确实存在news_id这类关联字段,并且添加评论时正确存储了对应文章的ID,否则评论也无法匹配到文章。
内容的提问来源于stack exchange,提问作者Kylazath
相关产品推荐
相关产品推荐

