Выходы все минус один - PullRequest
1 голос
/ 12 июля 2009

Я использую этот код для вывода всех тем с определенным идентификатором форума

$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

* 1011 темы *
id, title, message, fid

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

Был бы очень признателен за помощь!

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

Ответы [ 3 ]

7 голосов
/ 12 июля 2009

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

0 голосов
/ 12 июля 2009

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

 mysql_data_seek($query, 0);

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

0 голосов
/ 12 июля 2009

Причина, по которой у вас на один поток меньше ожидаемого, заключается в том, что вы выбираете первую тему в строке 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)) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...