我使用此代码输出具有特定论坛ID的所有线程
$query = mysql_query("SELECT * FROM forums JOIN threads ON threads.fid = forums.id WHERE forums.id = ".intval($_GET['forumID']));
$forum = mysql_fetch_assoc($query);
?>
<h1><a>Forums</a> > <?=$forum['name']?></h1>
<?php while ($thread = mysql_fetch_array($query)): ?>
<?=$thread['title']?>
<?php endwhile; ?>
论坛
id, name, description
的线程
id, title, message, fid
事情是它输出所有线程exept one。如果我删除它只是隐藏另一个。那是为什么?
真的很感激一些帮助!
抱歉,我的英语不是那么好,假设我在fid =的线程中有4条记录(在这种情况下为1),它只输出其中的3条答案 0 :(得分:7)
您正在使用第2行mysql_fetch_assoc中返回的第一行。在while循环条件中,mysql_fetch_array函数将从sql查询的第二行开始,而不是第一行。因此,列表中缺少第一行的ID。但是,如果使用列名,则还应使用mysql_fetch_assoc,而不是mysql_fetch_array。这不应该给你任何ID。
答案 1 :(得分:0)
您拥有的线程少于预期的原因是您要获取第2行中的第一个线程,但仅使用它来显示论坛名称。然后在while循环中获取第二行并从那里开始列出线程 - 缺少第一行。
我使用PHP中的do..while控件结构重构代码,如下所示:
$query = mysql_query("SELECT * FROM forums JOIN threads ON threads.fid = forums.id WHERE forums.id = ".intval($_GET['forumID']));
$thread = mysql_fetch_assoc($query);
if ($thread != null) {
echo "<h1><a>Forums</a> > $thread['name'] </h1>";
do {
echo $thread['title'];
} while ( $thread = mysql_fetch_array($query)) );
}
答案 2 :(得分:0)
正如txwikinger指出的那样,内部数组指针向前移动mysql_fetch_assoc()
,因此第一次使用mysql_fetch_array()
时,您将获得第二行。在第二次使用数组之前,您可以使用mysql_data_seek()
重置数组指针。
mysql_data_seek($query, 0);
我宁愿重新构建代码以使用两个查询,一个用于在一个小查询中获取论坛名称,另一个用于获取另一个查询中的所有线程。