8

正常に動作しているか、または fetchAll() が WHILE で機能しないかを知りたいです。

ここに例があります

$db=new PDO("mysql:host=" .$dbhost. "; dbname=" . $dbname, $dbuser, $dbpass);

$page=$db->prepare("SELECT * FROM page");
$page->execute();

foreach ($page->fetchAll(PDO::FETCH_ASSOC) as $row) {

//echo a row
//is working
}

ただし、しばらくループしてみると

while ($row=$page->fetchAll(PDO::FETCH_ASSOC)){

//echo a row
//Show empty
}

私は fetch() のみを使用しようとしましたが、機能していました。私の質問: fetchAll() が "WHILE" で機能しないのはなぜですか?

4

5 に答える 5

21

Fetch all は、結果セットに残っているすべてのレコードを返します。これを念頭に置いて、 foreach は期待どおりに結果セットを反復処理できます。

同等の while 実装は使用する必要があります$page->fetch(PDO::FETCH_ASSOC);

while ($row = $page->fetch(PDO::FETCH_ASSOC)){
   // do something awesome with row
} 

しばらく使用して、できることをすべて取得したい場合

$rows = $page->fetchAll(PDO::FETCH_ASSOC);

// use array_shift to free up the memory associated with the record as we deal with it
while($row = array_shift($rows)){
   // do something awesome with row
}

ただし、警告の言葉: fetch all はまさにそれを行います。結果のサイズが大きい場合、マシンのリソースに負荷がかかります。結果セットが小さいことがわかっている場合、またはクエリに制限を適用してそれを強制している場合にのみ、これを行います。

于 2013-07-18T16:46:04.217 に答える
8

PHPマニュアルから:

while 文の意味は単純です。while 式が TRUE と評価される限り、ネストされたステートメントを繰り返し実行するように PHP に指示します。

使用しているメソッドは配列を返すため、 $ while ($row=$page->fetchAll(PDO::FETCH_ASSOC))row を結果セット全体の配列に設定します。あなたが期待しているのは、 fetchAll メソッドがIterator クラスを拡張することですが、そうではありません。

foreachここに行くにはAが正しい方法です。

于 2013-07-18T16:48:12.830 に答える
6

1 つのコマンドですべてfetchAllのレコードをフェッチするため、レコードセットをループする必要はありません。いいですね。

$rows = $page->fetchAll(PDO::FETCH_ASSOC);

// $rows is an array containing all records...
foreach ($rows as $row)
    echo $row->fieldname;
于 2013-07-18T16:52:43.237 に答える
0

In while ループを使用fetchAllすると、最初の繰り返しですべてのレコードをフェッチし、次回はフェッチするものがありません。またforeach、最初の行ですべてのレコードをフェッチしましたがforeach、結果を反復に使用しています。

于 2013-07-18T16:46:37.160 に答える