输出全部减一
Posted
技术标签:
【中文标题】输出全部减一【英文标题】:Outputs all minus one 【发布时间】:2009-07-12 02:54:13 【问题描述】:我使用此代码输出具有特定论坛 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
事情是它输出除一个以外的所有线程。如果我删除一个,它只会隐藏另一个。这是为什么呢?
非常感谢您的帮助!
对不起,我的英语不太好,假设我在 fid = 的线程中有 4 条记录(在本例中为 1),它只输出其中的 3 条
【问题讨论】:
我会为这个问题添加一个 PHP 标签。您的 SQL 看起来不错。你对你的 PHP 循环语法有多大把握? 【参考方案1】:您正在使用第 2 行 mysql_fetch_assoc 中返回的第一行。在您的 while 循环条件中,mysql_fetch_array 函数将从 sql 查询的第二行开始,而不是第一行。因此,您的列表中缺少第一行的 id。但是,如果使用列名,还应该使用 mysql_fetch_assoc,而不是 mysql_fetch_array。这不应该给你任何 ID。
【讨论】:
【参考方案2】:您的线程数比您预期的少一个原因是您正在获取第 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)) );
【讨论】:
【参考方案3】:正如 txwikinger 所指出的,内部数组指针向前移动了mysql_fetch_assoc()
,所以第一次使用mysql_fetch_array()
时,你会得到第二行。在第二次使用数组之前,您可以使用mysql_data_seek()
重置数组指针。
mysql_data_seek($query, 0);
我宁愿重组代码以使用两个查询,一个在一个小查询中获取论坛名称,另一个在另一个查询中获取所有主题。
【讨论】:
以上是关于输出全部减一的主要内容,如果未能解决你的问题,请参考以下文章