2

while ループで結果を表示する際に、これらのコード スニペットがどのように異なるかについて混乱しています。コードの最初のスニペットは完全に機能しますが、2 番目のコードでは結果が表示されますが、無限ループで表示され、結果が繰り返されます。誰かが私に理由を説明できますか?

$stmt = $db_conn->prepare($sql);

$stmt->execute(array("Lorna", 3));

while($result = $stmt->fetch()){
    echo $result["name"] . "<br />" . $result["description"] . "<br />";        
}

$stmt->fetch() を $data という変数に入れ、$stmt->fetch() を while ループに入れる代わりにこれを渡そうとすると、無限ループが発生します。

$stmt = $db_conn->prepare($sql);

$stmt->execute(array("Lorna", 3));

$data = $stmt->fetch();

while($result = $data){
    echo $result["name"] . "<br />" . $result["description"] . "<br />";        
}

前もって感謝します!

4

3 に答える 3

2

fetch()Ifは行を進める呼び出しです。

ケース1

while($result = $stmt->fetch()){
    //every iteration executes fetch
    //advances it by one row
    //turns to false when no more rows
}

ケース 2

$data = $stmt->fetch();
//now at first row
while($result = $data){
    //always at first row 
    //always evaluates to true (no calls to fetch)
}
于 2013-01-20T21:38:40.730 に答える
2

最初のコード スニペットでは、 が呼び出されるたびwhileに、クエリ結果ポインターが新しい行に移動します。最終的にポインターは結果セットの最後に到達し、$stmt->fetch()false を返し、ループを終了します。

2 番目のループでは、ループの前に次の行を 1 回だけ繰り返します。何も変更されないため、ループは同じループを何度も繰り返し、ループ条件が false を返すことはありません。

于 2013-01-20T21:38:55.827 に答える
1

最初のループは、null の可能性がある関数から返された値をチェックし、ループを終了させます。

2 番目のループは、割り当てを行うだけです。

于 2013-01-20T21:39:37.157 に答える