为什么MySQL从数据库中检索时会遗漏第一行?

时间:2009-09-15 18:46:03

标签: php mysql sql

出于某种原因,我在从数据库中检索数据时遇到问题。它不包括列出的第一个项目。

连接:

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 个答案:

答案 0 :(得分:9)

您已将第一行分配给$row_rs_jobboards11,因此当您在do / while循环中调用$row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)时,它将从表格​​的第二行开始。

使用do / while而不是一会儿没有任何区别,但使用不同的变量名确实有所不同。

更新,解释while,do / while之间的区别,并确保您的变量名称正确。

while循环,有效:

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

执行/ 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,则必须在之前创建行变量才能进入循环。和,
  • 确保您的变量名称匹配!

答案 1 :(得分:3)

因为您使用的是do-while而不是while。在第一次迭代时,$ row_rs_cms11未定义。

答案 2 :(得分:2)

您正在使用$ 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的代码部分。

答案 3 :(得分:2)

在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循环,然后在那里读取第一行