3

我正在过渡到 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($conn->query('SELECT * FROM products') as $row) {
    echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />";  
}
4

2 回答 2

10

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

由于 while 循环将$row在每次迭代时覆盖,看起来您从第二行开始,但发生的是$row第一次 while 循环迭代的值被覆盖。

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

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

这里的值$row将首先打印,然后再被while条件覆盖。

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

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

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

if ($stmt->columnCount()) {
   while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
       echo $row['product_name'].' '.$row['price'].' '.$row['color'], "<br />"; 
   }
}
于 2013-03-18T05:21:15.377 回答
5

不要做$row = $stmt->fetch()之前的循环。

于 2013-03-18T05:20:55.523 回答