Почему MySQL пропускает первую строку при извлечении из базы данных? - PullRequest
1 голос
/ 15 сентября 2009

По какой-то причине у меня проблема с получением данных из моей базы данных. Это исключает первый элемент в списке.

Соединение:

mysql_select_db($database_my_db, $my_db);

    $query_rs_jobboards11 = "SELECT * FROM jobBoardsSpecTypes ORDER BY type";
    $rs_jobboards11 = mysql_query($query_rs_jobboards11, $my_db) or die(mysql_error());
    $row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11);
    $totalRows_rs_jobboards11 = mysql_num_rows($rs_jobboards11);

Выход:

 <form action="" method="get">
        <select name="specialty">

         <?php do { ?>

    <option value="<?php echo $row_rs_cms11['type']; ?>"><?php echo $row_rs_cms11['type']; ?></option>


    <?php } while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)); ?> 


        </select>

<input type="submit" value="Go" />

</form>

Он продолжает пропускать первую запись в столбце типа. Если я добавлю больше записей, то будет показана та, которая была пропущена ранее, а новая запись скрыта.

Что я делаю не так? База данных прекрасно работает для всего, кроме этой страницы.

Ответы [ 4 ]

9 голосов
/ 15 сентября 2009

Вы уже присвоили первой строке $row_rs_jobboards11, поэтому, когда вы вызываете $row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11) в цикле do / while, он начинается со второй строки таблицы.

Использование do / while вместо while не имеет значения, но использование разных имен переменных имеет значение.

Обновление, чтобы объяснить разницу между while, do / while и проверкой правильности имен переменных.

цикл while, который работает:

while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)) {
    echo '<tr>';
    //stuff here
    echo '</tr>';
}

цикл do / while, который также работает

$row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11);
do {
    echo '<tr>';
    //stuff here
    echo '</tr>';
} while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11));

Обратите внимание, что переменная $ row совпадает. Если вы пропустите первый вызов, он все равно будет работать, но вы получите дополнительный (пустой) перед выводом любого контента. Если вы установите переменную с другим именем (и используете вызов mysql_fetch_ *), внутренний указатель базы данных будет установлен на вторую строку таблицы. Следовательно, вы пропускаете первую строку в таблице, поскольку для нее установлена ​​другая (неиспользуемая) переменная.

Мораль истории:

Вы можете использовать цикл while или do / while, просто убедитесь, что

  • Если вы используете do / while, переменная строки должна быть создана до для входа в цикл. И,
  • Убедитесь, что имена ваших переменных совпадают!
3 голосов
/ 15 сентября 2009

Потому что вы используете do-while, а не while. На первой итерации $ row_rs_cms11 не определено.

2 голосов
/ 15 сентября 2009

На самой первой итерации цикла do / while значение $row_rs_cms11 не устанавливается. Он устанавливается на следующей итерации с помощью кода while, но в первый раз он пуст. Я полагаю, вы просто неправильно назвали переменную.

Изменить это:

$row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11);

К этому:

$row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11);

Еще лучше, не делайте этого первого mysql_fetc_assoc() вызова вообще, просто измените ваш цикл do/while только на цикл while, и вместо него будет прочитана первая строка.

2 голосов
/ 15 сентября 2009

Вы используете $ row_rs_cms11, где вы действительно имели в виду $ row_rs_jobboards11 ($ row_rs_cms11 не определяется в первый раз).

    <?php do { ?>

<option value="<?php echo $row_rs_jobboards11['type']; ?>"><?php echo $row_rs_jobboards11['type']; ?></option>


<?php } while ($row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11)) ?> 


    </select>

Ошибка была бы более очевидной, если бы вы использовали while () вместо do {} while ().

Если вы измените do {} while () на while (), как было предложено, вам нужно удалить часть кода, из которой вы впервые получаете $ row_rs_jobboards11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...