输出全部减1

时间:2009-07-12 02:54:13

标签: php sql join

我使用此代码输出具有特定论坛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> &gt; <?=$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条

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> &gt; $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);

我宁愿重新构建代码以使用两个查询,一个用于在一个小查询中获取论坛名称,另一个用于获取另一个查询中的所有线程。