3

PDO プリペアード ステートメントに移行していますが、ステートメントSELECTを使用した基本的なクエリの構文に問題がありますWHILE

以下のforeachステートメントは正しい結果をエコーし​​ますが、PDO::FETCH_ASSOCクエリは返された最初の結果をスキップしています (そのため、常に必要な結果よりも少ない 1 つの結果をエコーし​​ます)。

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 />";  
}
4

2 に答える 2

10

while ループの前に、すでに最初の行をフェッチしています$row = $stmt->fetch();。この行を削除すると、期待どおりに機能します。

while ループは$row繰り返しごとに上書きされるため、2 行目から開始するように見えますが$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ます。

この特定のケースでは、結果がないときに何もエコーしたくありません

その場合は、最初にクエリが結果を返したかどうかを確認してください。ここで私はチェックで明示的です。outer を削除した場合でもifwhileループは意図どおりに実行されるためです。つまり、結果がなければ何もエコーしません。

ただし、コードに明確な意図があることは常に良いことです。

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 に答える