14

PDO ステートメントからの結果の反復子を作成しようとしていますが、最初の行に巻き戻す方法が見つかりません。fetchAll を呼び出してすべての結果データを保存するオーバーヘッドを回避したいと考えています。

// first loop works fine
foreach($statement as $result) {
    // do something with result
}

// but subsequent loops don't
foreach($statement as $result) {
    // never called 
}

ステートメントをリセットしたり、最初の行を探したりする方法はありますか?

4

5 に答える 5

11

これはデータベースに依存していると確信しています。そのため、それは避けるべきものです。ただし、バッファリングされたクエリを有効にすることで、目的を達成できると思います。それが機能しない場合は、いつでも結果を配列にプルできますfetchAll。どちらのソリューションもアプリケーションのパフォーマンスに影響を与えるため、結果セットが大きい場合はよく考えてください。

于 2008-11-10T18:10:43.453 に答える
9

このプレゼンテーションのスライド 31 を参照してください$statement->rewind()。バッファリングされたクエリに適用される場合は、実行できます。mysql を使用する場合は、次を使用してバッファリングされたクエリをエミュレートできますPDO_MYSQL_ATTR_USE_BUFFERED_QUERY

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

@NoahGoodrichはあなたにsplを指摘しました。常に機能する例を次に示します。

$it = new ArrayIterator($stmt->fetchAll());
于 2008-11-10T18:46:08.497 に答える
2

ずっと前に質問されましたが、現在別の解決策があります。

このメソッドPDOStatement::fetch()は、2 番目のパラメータであるカーソルの向きを、PDO::FETCH_ORI_*定数の 1 つと共に受け取ることができます。これらのパラメータは、 が属性asPDOStatementで作成されている場合にのみ有効です。PDO::ATTR_CURSORPDO::CURSOR_SCROLL

これにより、次のようにナビゲートできます。

$sql = "Select * From Tabela";
$statement = $db->prepare($sql, array(
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
));
$statement->execute();
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_NEXT);  // return next
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_PRIOR); // return previous
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST); // return first
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_LAST);  // return last
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_ABS, $n); // return to $n position
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_REL, $n); // return to $n position relative to current

詳細については、ドキュメントPDO の事前定義された定数を参照してください。

注:PDO::FETCH_BOTHがデフォルトであるため使用されます。プロジェクトに合わせてカスタマイズしてください。

于 2016-08-10T14:52:14.917 に答える
1

おそらく、オブジェクトへの配列のようなアクセスを提供するために拡張できる PHP SPL クラスのいくつかを見てみたいと思うでしょう。

  • 標準 PHP ライブラリ (SPL)特に、ArrayIterator、ArrayObject、およびおそらく Iterator インターフェイスに注目することをお勧めします。
  • 簡単なチュートリアル
  • 別のクイック チュートリアル
于 2008-11-10T16:20:17.233 に答える