Query返回正确的行数,但第1行丢失

时间:2015-12-24 05:12:01

标签: php mysql mysqli

以下查询返回171行,这是正确的。但是当我运行for循环代码时,它总是从第2行而不是1开始。我做错了什么?我在我的SQL编辑器中运行了回显的代码,我从1到171得到了正确的值。

SELECT firstname, lastname, DATE_FORMAT(som_moyr, '%m') AS twomo, MONTHNAME(som_moyr) AS month, EXTRACT(year FROM som_moyr) AS year, aom_moyr, sb_moyr, vb_moyr, hmh_moyr, tog_moyr, wdb_moyr, unit, charter, status    FROM BSA_Awards WHERE som_moyr > '0000-00-00' AND som_moyr < '2016-01-07' ORDER BY som_moyr DESC

for ($i = 1; $i <= $num_rows; $i++) { 

$row = $sql->fetch(PDO::FETCH_ASSOC);
echo("num rows= $num_rows i= $i firstname= $firstname");

}

如果我将DESC从查询中删除,我会得到整个列表并且所有行都存在,但它们的排列顺序可能符合我的需要。 DESC显然导致了这个问题,但是如何以及为什么?

3 个答案:

答案 0 :(得分:1)

尝试循环sart为0,我认为它会起作用。

SELECT firstname, lastname, DATE_FORMAT(som_moyr, '%m') AS twomo, MONTHNAME(som_moyr) AS month, EXTRACT(year FROM som_moyr) AS year, aom_moyr, sb_moyr, vb_moyr, hmh_moyr, tog_moyr, wdb_moyr, unit, charter, status    FROM BSA_Awards WHERE som_moyr > '0000-00-00' AND som_moyr < '2016-01-07' ORDER BY som_moyr DESC

for ($i = 0; $i < $num_rows; $i++) { 

$row = $sql->fetch(PDO::FETCH_ASSOC);
echo("num rows= $num_rows i= $i firstname= $firstname");

}

答案 1 :(得分:0)

for循环中有$i = 1;。试试$i = 0;

<强>更新

从您在评论中发布的代码中,您在for循环中从第2行开始的原因是由于您在循环之前调用$sql->fetch();一次。这将返回第一行。当循环执行并且你调用$row = $sql->fetch(PDO::FETCH_ASSOC);时,这将返回下一行。

另外,有关对SELECT语句使用rowCount()函数的警告。它不能保证按文档说明:

  

如果关联的PDOStatement执行的最后一条SQL语句是   一个SELECT语句,一些数据库可能会返回行数   由该声明返回。但是,不保证这种行为   适用于所有数据库,不应依赖于便携式数据库   应用

答案 2 :(得分:0)

for ($i = 0; $i < $num_rows; $i++)

开始$i=0$i<$num_rows