2009-07-12 3 views
1

Я использую этот код, чтобы вывести все темы с определенным форума 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

Дело в том, что он выводит все потоки, кроме одного. Если я удалю его, он просто скрывает другого. Почему это?

Поблагодарили бы за помощь!

жаль мой английский не так хорошо, позволяет сказать, что у меня есть 4 записей в потоках с FID = (в данном случае 1), он выводит только 3 из них

+0

Я бы добавил к этому вопросу PHP-тег. Ваш SQL выглядит отлично. Насколько вы уверены в синтаксисе цикла PHP? – Bill

ответ

7

Вы используете первый ряд, возвращенный в mysql_fetch_assoc в строке 2. В вашем состоянии цикла while функция mysql_fetch_array будет начинаться со второй строки запроса sql, а не первой. Поэтому идентификатор из первой строки отсутствует в вашем списке. Однако, если вы используете имя столбца, вы также должны использовать mysql_fetch_assoc, а не mysql_fetch_array. Это не должно давать вам никаких идентификаторов.

0

Причина, по которой у вас есть меньше нитей, чем вы ожидаете, состоит в том, что вы извлекаете первый поток в строке 2, но используете его только для отображения имени форума. Затем вы выбираете вторую строку в цикле while и начинаете оттуда, чтобы перечислить потоки - пропустить первую строку.

Я рефакторинг кода с использованием структуры do..while управления в PHP следующим образом:

$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))); 
} 
0

Как txwikinger указал, внутренний указатель массива перемещается вперед mysql_fetch_assoc(), поэтому в первый раз вы используете mysql_fetch_array() , вы получите вторую строку. Вы можете сбросить указатель массива с mysql_data_seek() перед использованием массива во второй раз.

mysql_data_seek($query, 0); 

Я предпочел бы реструктурировать код, чтобы использовать два запроса, хотя, один, чтобы получить имя форума в одном крошечном запросе, и один, чтобы получить все нити в другом запросе.

Смежные вопросы