此PDO :: FETCH_ASSOC`查询跳过返回的第一个结果

时间:2013-03-18 05:19:18

标签: php pdo fetch

我正在转换到PDO预处理语句,而我在使用SELECT语句进行基本WHILE查询的语法时遇到问题。

下面的foreach语句回显了正确的结果,但PDO::FETCH_ASSOC查询正在跳过返回的第一个结果(所以它总是回显一个比它应该少的结果)。

PDO :: FETCH_ASSOC

$stmt = $conn->prepare("SELECT * FROM products"); 
$stmt->execute();
$row = $stmt->fetch();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
}

的foreach

foreach($conn->query('SELECT * FROM products') as $row) {
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />";  
}

2 个答案:

答案 0 :(得分:10)

您已经在while循环$row = $stmt->fetch();之前获取了第一行。如果删除此行,它将按预期工作。

由于while循环将在每次迭代时覆盖$row,看起来就像从第二行开始,但是第一次循环迭代时,$row的值会被覆盖。< / p>

要让循环按照您编写的方式工作,您需要使用do-while构造:

$row = $stmt->fetch();
do {
     echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />";
} while($row = $stmt->fetch(PDO::FETCH_ASSOC));

此处$row的值将在被while条件覆盖之前首先打印。

  

在这种特殊情况下,我不想在没有任何结果时回复任何内容

如果是这种情况,请检查您的查询是否首先返回任何结果。在这里,我在检查中是明确的,因为如果你删除了外部if,你的while循环仍然会遵循你的意图 - 也就是说,如果没有任何内容,它将不会回应任何内容结果

但是,在代码中有明确的意图总是好的:

if ($stmt->columnCount()) {
   while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
       echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
   }
}

答案 1 :(得分:5)

在循环之前不要$row = $stmt->fetch()