TOP書籍連動> データの検索
PDOの紹介
PDOの紹介

第3回:データの検索

著者:Ilia Alshanetsky   2005/12/21
1   2  3  次のページ
データの検索

   ここではデータの検索という非常に重要な機能を紹介します。PDOのこの機能に、他のデータベースエクステンションと比べて抜群の柔軟性と将来性を感じることでしょう。データ検索を取り扱う前に、レコードのセットを返すクエリを実行することで処理の流れを簡単に確認してみましょう。

   データ検索用のクエリを実行するためには、スクリプトの中で1度だけquery()メソッドを実行する必要があります。この関数の最初の引数にクエリ文字列を指定して、クエリが実行されて成功すると、取得したデータセットを持つPDOStatementオブジェクトを取得することができます。

   実際のデータは、このオブジェクトから様々な方法で抽出されます。1つ目の方法はfetch()メソッドを使用することです。これは、標準では、それぞれの行が数値のキーとカラム名の文字列から成るキーの両方を持つ連想配列を返します。

$rows = $db->query("SELECT id FROM foo");
while ($row = $rows->fetch()) {
     var_dump($row); // Ex: array(0 => 1, id=>1)
}

   多くの場合、両方のキーを持つのは無意味で非効率でしょう。それで、fetch()メソッドは関数のパラメータを変更することで取得する配列のキーを指定できるようになっています。PDO_FETCH_NUMは数値のキーのみを取得する場合に使用され、最初のキーが0でカラムの数の分だけキーが増加します。この方法は最も速く結果が返されます。

   2つめの方法は数値のキーに比べると若干遅いですが、よりユーザフレンドリーな文字列のキーで配列を取得する方法です。引数にPDO_FETCH_ASSOCを設定することで連想配列で結果を取得できます。最後は、PDO_FETCH_OBJです。これを使用すると、返されるそれぞれの行がstdClassオブジェクトのインスタンスになります。この場合カラム名はオブジェクトのメンバ変数名になります。

$rows = $db->query("SELECT id FROM foo");
while ($row = $rows->fetch(PDO_FETCH_OBJ)) {
     var_dump($row);// object(stdClass)#1 (1)
     {["id"]=> int(1)}
}

   これらの3種類のデータ取得方法では不充分なので、PDOはもう1つの方法のPDO_FETCH_LAZYをサポートしています。取得された結果の多くは、データの一部分のみが使用されることがほとんどです。理想的には、使用しない余計なデータは単純にSQLで取得しないようにすればよいのですが、実際には取得してしまうことも多いでしょう。

   PDO_FETCH_LAZYを指定すると、PDO_FETCH_OBJを指定した時のようにそれぞれの行をオブジェクトとして取得するのですが、それぞれのカラムに対応するメンバ変数がアクセスされてはじめて値が格納されます。

   そのため、10個のカラムを含んだ結果を取得して5つのカラムを使用する場合、実際に値にアクセスされた5つのカラムの分だけメモリが使用されるので、データ取得時のオーバーヘッドを減らすことができます。

   結果オブジェクトには必ずしも標準のstdClassを使用する必要はありません。PDOは様々なオブジェクトのインスタンスを作成する方法を提供し、それらのメンバ変数に取得した値を格納します。

   カラム名はオブジェクトのメンバ変数を参照するために使用されます。もしメンバ変数がすでに定義されていれば値が割り当てられ、定義されていない場合でも動的に変数が作成されます。この機能はfetchObject()メソッドを通して使用できます。クラス名を最初のパラメータに指定して、オプションで第2引数に配列形式でクラスのコンストラクタの情報を指定します。

$stmt = $db->query("SELECT * FROM user WHERE id=1");
$reg = $stmt->fetchObject("user_data");

   この取得メカニズムを使用すると$regにuserテーブルから取り出されたuser_dataクラスのインスタンスが格納されます。オブジェクトベースのデータ取得は結果を取得するたびに新しいオブジェクトを作らなければならない、というわけではありません。オブジェクトの生成はPHPの中でも遅い処理なので、毎回のオブジェクトの生成を避けることで高パフォーマンスな処理を実現することができます。

   この方法を実行するには、取得モードを設定するために使われるsetFetchMode()メソッドを呼び出す必要があります。この関数を使用するとfetch()メソッドでモードを指定するよりも柔軟に対応することができ、モードとクラスインスタンスの関連を定義するなど、詳細な設定を行うことができるようになります。

$reg = new user_data;
$stmt->setFetchMode(PDO_FETCH_INTO, $reg);
while ($stmt->fetch()) {
     // $reg == user_data class filled with
     from-db data
}
1   2  3  次のページ

PHPプログラマーズマガジン 書籍紹介
PHPプログラマーズマガジン

PHPプログラマーズマガジンは、PDF形式で読者の方にお届けするPHP言語(PHP: Hypertext Processor)専門誌です。 カナダMTA出版のphp|architect誌を日本語に翻訳し、独自の記事を加えて月刊でお届けしています。

発行:アシアル株式会社  価格:1,029円

 ご購入はこちら
http://www.asial.co.jp/magazine/
Ilia Alshanetsky
著者プロフィール
Ilia Alshanetsky
PHP開発チームの活動メンバーの1人であり、現在のPHP 4.3.X.のリリースマネージャー。また、オープンソース掲示板FUDフォーラム(http://fud.prohost.org/forum/)をはじめとする数多くのプロジェクトにも貢献している。


INDEX
第3回:データの検索
  データの検索
  データ取得処理の向上
  特殊文字の扱い