TOP書籍連動> バインドメカニズム
PDOの紹介
PDOの紹介

第4回:データの検索とその他機能の紹介

著者:Ilia Alshanetsky   2005/12/28
1   2  3  次のページ
バインドメカニズム

   前回に引き続き、データ検索について紹介します。

   データ検索で使用できるもう1つの機能としてバインドメカニズムがあげられます。これは新しい変数を配列として作成したり、レコードを保存するオブジェクトについての話ではなく、すでに存在している変数に対して取得する値を割り当てるという話です。

   この方法は多くの場面で使用することができます。例えば、テンプレートを使用している場合であれば、データベースから取得した値はテンプレート変数に割り当てる必要があるでしょう。

   変数のバインドを行うと、自動的に変数の割り当てを行うことができるので、コードをよりシンプルにすることができ、パフォーマンスが改善されることもあるでしょう。変数のバインドを使用する場合はPDOStatementオブジェクトのbindColumn()メソッドを、データの取得よりも先に実行して、結果セットのカラムとそのカラムに対応するPHP変数の関連付けを行う必要があります。

$stmt = $db->query("SELECT login, pass FROM user");
$stmt->bindColumn(1,$login);
$stmt->bindColumn(2,$pass);

   bindColumn()メソッドは2つの引数を指定して呼び出すことができます。第1引数はバインドするカラムの位置です。この位置は0ではなく1からカウントするので注意が必要です。

   他のPDOの数のカウントでは0からはじまっていましたが、ここでは1からになります。これは他の言語でのデータベースインターフェースの方法を踏襲しているためです。数値での指定だと他のメソッドとの統一性がとれないということであれば、もちろんカラム名を使用することもできます。カラム名がFOOのときにfooをバインドしようとしてもできません。

   第2引数は単純に値が割り当てられる変数を指定します。このとき指定する変数はbindColumn()メソッドは参照形式で取得します。

$stmt = $db->query("SELECT id,login FROM user");
$stmt->bindColumn('id', $id);
$stmt->bindColumn('login', $login);
while ($stmt->fetch(PDO_FETCH_BOUND)) {
     // $login == current value of login column
     (as a string)
     // $id == current value of id column (as an integer)
}

   データを取得するときには、fetch()メソッドの引数にPDO_FETCH_BOUNDモードを指定します。このとき返り値はレコードセットではなくレコードがあるかどうかについてのBOOLEANになります。

   TRUEが返ってきている場合はbindColumn()メソッドでバインドされた変数に指定されたカラムの値が入っています。


部分的なデータ取得

   データ取得のさいに、PDOは可能な限りメモリを使用しない処理を行います。これには結果セットをメモリ上にあらかじめ配置しないようにする、アンバッファードクエリの使用が含まれています。

   この最適化ではアンバッファードクエリが使用されるので、取得していない結果セットに関して、その情報は接続されている間データベースで保存されます。すべてのレコードを取得する前に他のクエリを実行すると、エラーとなってしまいます。この問題を回避するために、スクリプトで"while($stmt->fetch());"とするとすべての行の取得を強制的に行うことができます。

   しかし、不必要なデータを検索して一時的に保存するというのは効率が悪いでしょう。これを解決する簡単な方法はLIMIT句を使用することで、取得する結果セットの行数を制限します。LIMIT句での制限ができない場合は、PDOでcloseCursor()メソッドを使用することができます。

   closeCursor()メソッドはすべての行が取得されていなくても、強制的に行の取得処理を終了することができます。

$stmt = $db->query("SELECT * FROM foo");
while ($res = $stmt->fetch()) {
     ⁄* some code that may set $abort to TRUE *⁄
     if ($abort) {
          $stmt->closeCursor();
          break;
     }
}
// now can safely execute another query.
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
第4回:データの検索とその他機能の紹介
  バインドメカニズム
  プリペアードステートメント
  ユーティリティ関数