修改phpBB MySQL查询:显示指定主题全部帖子而非单帖
搞定啦!修改代码显示指定主题下的所有帖子
嘿,我看了你的代码,原逻辑是抓取forum_id=11里每个主题的最后一条回复,和你要显示topic_id=7下所有帖子的需求不匹配。下面是修改后的完整代码,我把关键改动都标出来了,你直接替换就行:
<?php // 现在这个变量控制显示该主题下的帖子数量,设为0就显示所有;要限制数量就改数字 $postnumber = 0; // 替换成你的phpBB路径 $urlPath = "../path/to/forum"; // 引入phpBB的数据库配置 include '../path/to/forum/config.php'; $table_topics = $table_prefix. "topics"; $table_posts = $table_prefix. "posts"; $table_users = $table_prefix. "users"; // 注意:mysql_*函数已经被PHP废弃了,后续建议换成mysqli或PDO,先按你现有代码改 $link = mysql_connect("$dbhost", "$dbuser", "$dbpasswd") or die("数据库连接失败"); mysql_select_db("$dbname") or die("无法选择数据库"); // 核心修改的SQL查询 $query = "SELECT t.topic_id, p.post_text, t.topic_title, t.forum_id, p.post_id, p.poster_id, p.post_time, u.username FROM $table_topics t -- 关联主题下的所有帖子(原来只关联最后一条) JOIN $table_posts p ON p.topic_id = t.topic_id JOIN $table_users u ON p.poster_id = u.user_id WHERE t.topic_id = 7 -- 指定要展示的主题ID AND t.topic_status <> 2 -- 排除已锁定的主题 ORDER BY p.post_time ASC -- 按发帖时间正序(最早的在前),倒序就用DESC ". ($postnumber > 0 ? "LIMIT $postnumber" : ""); // 可选:限制显示数量 $result = mysql_query($query) or die("查询失败:". mysql_error()); // 加错误信息方便调试 print '<div class="news_block">'; // 先显示一次主题标题(所有帖子都属于同一个主题,不用重复显示) if ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<h4><a href=\"$urlPath/viewtopic.php?f=$row[forum_id]&t=$row[topic_id]\" target=\"_blank\">" . $row["topic_title"] . "</a> </h4>"; // 显示第一条帖子 echo "<div style='margin: 10px 0; padding-bottom: 10px; border-bottom: 1px solid #eee;'>"; echo "作者: " . $row["username"] . ' - ' . date("Y-m-d H:i:s", $row["post_time"]) . "<p>" . $row["post_text"] . "</p>"; echo "</div>"; // 显示剩下的帖子 while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<div style='margin: 10px 0; padding-bottom: 10px; border-bottom: 1px solid #eee;'>"; echo "作者: " . $row["username"] . ' - ' . date("Y-m-d H:i:s", $row["post_time"]) . "<p>" . $row["post_text"] . "</p>"; echo "</div>"; } } else { echo "<p>这个主题没有帖子,或者主题不存在/已被锁定哦~</p>"; } print "</div>"; mysql_free_result($result); mysql_close($link); ?>
关键改动说明:
- SQL关联逻辑:把原来的
p.post_id = t.topic_last_post_id改成p.topic_id = t.topic_id,这样就能拉取指定主题下的所有帖子,而不是只抓最后一条回复。 - 筛选条件:保留
t.topic_id =7锁定目标主题,去掉了t.forum_id=11(因为指定主题ID后,对应的论坛是固定的,没必要额外筛选;如果要确保主题属于某个论坛,可以加回来)。 - 显示优化:原来的代码会每个帖子都重复显示主题标题,现在改成只显示一次,更合理;还给每个帖子加了简单的样式区分,看起来更清晰。
- 排序调整:按
p.post_time ASC正序显示,帖子按发布顺序排列;如果想先看最新的帖子,改成DESC就行。 - 调试方便:在查询错误提示里加了
mysql_error(),如果SQL出问题能直接看到错误原因。
重要提醒:
mysql_*系列函数已经在PHP 7.0及以上版本被移除了,不仅不安全,还可能导致代码在新服务器上运行不了。如果你的PHP版本比较新,建议把代码改成用mysqli或者PDO,这俩是现在官方推荐的数据库操作方式哦。
内容的提问来源于stack exchange,提问作者user9220830
相关产品推荐
相关产品推荐

