2012-02-24 26 views
15

mysqlのSELECTメソッドからPDOメソッドへの移行に問題があります。フェッチされた配列を2回反復したいが、どちらも行ゼロで始まる。 mysqlで私は使用します:PDO結果の配列ポインタのリセット

mysql_data_seek($result,0); 

私は同じことを達成する方法がわかりません。以下のコードは私がこれをやろうとしているところです。最初のwhileループは正常に動作しますが、2番目のwhileループは何も返しません。誰かが私がどこに間違っているのか教えてもらえますか?

$pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$stmt->execute(); 

while($row = $stmt->fetch()) 
{ 
    //do something starting with row[0] 
} 
while($row = $stmt->fetch()) 
{ 
    //do something else starting with row[0] 
} 

ありがとうございました。

答えて

23

結果を配列に保存し、その配列を2回ループします。

$pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$stmt->execute(); 

$rows = $stmt->fetchAll(); 

foreach ($rows as $r) { 
    // first run 
} 

foreach ($rows as $r) { 
    // seconds run 
} 
+0

うわー!それは明らかです。私がなぜwhileループを使用していたのか分かりません。頭の中でキックありがとう! – user1028866

+0

[ドキュメント](http://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query)を無視したためです。 – AnrDaemon

+0

これは大きな結果セットを扱う際にはお勧めできません。すべてのデータは配列に格納されます。 –

2
fetch — Fetches the next row from a result set 

それはすでに二しばらくは何も返さない理由ですあなたたresultSet の最後の要素に到着しながら、それは最初に終了したとき。

fetchAllを使用してすべての結果を保存します。

+0

ありがとうございました。今はうまくいきます。 – user1028866

-3
if($stmt->fetchColumn() >= 0) 
{ 
    $stmt->execute(); //Reset cursor 
    while($rs = $stmt->fetchObject()) 
    { 
     echo "Data: ".$rs->data; 
    } 
} 
else 
{ 
    echo '0'; 
} 
+0

答えのテキストで説明できますか? –

+0

OPはフェッチされた配列を2回反復しようとしています。あなたのコードには1つのループしか見ることができません。したがって、あなたのコードは、OPの問題に対する解決策はどれくらいですか? – honk

2

fetchAll()の結果を格納することがオプションでないことがあります。代わりに、このようにfetchAll()を呼び出す前にpdoオブジェクトをクローンするだけで済みます。

$pdo_copy = clone $pdo; 

$num_rows = count($pdo_copy->fetchAll()); 

私は引き続きpdoオブジェクトを使用してfetchObject()のような文を実行できます。

1

PHPマニュアルでも、PDO :: prepare()を使用してPDOStatementオブジェクトを準備すると、複数回PDOStatement :: execute()を呼び出して問合せを発行できます。 コードはそのように見えます。

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 

//First execute 
$stmt->execute(); 
while($row = $stmt->fetch()) 
{ 
    //do something starting with row[0] 
} 

//Second execute 
$stmt->execute(); 
while($row = $stmt->fetch()) 
{ 
    //do something else starting with row[0] 
} 

ソース:http://php.net/manual/en/pdo.query.php

+0

私はあなたに+1を与えました、これは正解ですが、fetchAll()は何千もの行を必要としませんが、問題は「PDO結果の配列ポインタをリセットしています」です。これは本当にカーソルを最初の行にリセットします。 – Robert