0

MySQL クエリまたはテーブル オブジェクトが必要です。たとえば、PDO オブジェクトを入力として取り、テーブルで必要なすべてのことを行うものです。

このオブジェクトは 、 などの配列インターフェイスを実装できると考えていたので、通常の配列のように行をCountable簡単に処理できました。ArrayAccessIteratorforeach

非推奨の関数には、行ごとに移動するのmysql_*に役立つ非常に便利な function がありました (まだあります) 。そのため、すべてのメソッドを実装できました。最初に 1 つのクエリを実行し、リソースのプライベート フィールドに行を保持して、必要に応じてサービスを提供できます。mysql_data_seek()Iterator

適切なクエリをデータベースに送信して結果を取得することで、他の機能 (主に情報提供などmysql_list_tables()) をカバーできますが、特定の行に移動するにはどうすればよいでしょうか?

fetch()メソッドの最後のパラメータがカーソル位置だと思っていたのですが、呼び出すと

$p = $database->query('SELECT * FROM tobjects');
$row = $p->fetch(PDO::FETCH_ASSOC, PDO::ATTR_CURSOR,$i);

の値に対して常に同じ行になります$i

編集

実際には同じ行ではありませんが、 の最初の呼び出しで 1 行目fetch()、2 行目で 2 行目など、カーソル情報がないようです。回答で示唆されているように、私はこれを行いました

$p = $database->prepare('SELECT * FROM tobjects',
                    array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$p->execute();
$row = $p->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $i);

しかし、これは同じように機能します。

4

2 に答える 2

1

使い方がPDO::ATTR_CURSOR間違っています。必要なことは、最初に を使用してスクロール可能なカーソルを要求することPDO::prepareです。次に、結果セット内の任意のレコードに移動できます。

$s = $database->prepare('SELECT * FROM tobjects',
                        [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$s->execute();
$row = $s->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $i);
于 2013-04-11T19:54:20.243 に答える
0

これらの関数は、実際のシナリオに役立つとは思いません。

実際、mysql_list_tables() は、情報スキーマへのより有益で柔軟なクエリに置き換えることができます

すでに通常の配列を使用できるのに、わざわざ ArrayAccess を実装する必要があるでしょうか。シナリオは 2 つだけです。

  • 必要なデータ量が比較的少なく、Web ページに適しています。一気に選択するだけです。

    $data = $stmt->fetchAll();
    

    そして、結果の配列を好きなようにトラバースできます。

  • または、ある種のコンソール サービス スクリプトで長いテーブルをトラバースする必要があります。その場合、前後にトラバースする必要はありません。選択してループするだけです。

于 2013-04-11T20:08:00.290 に答える