TOP書籍連動> データ取得処理の向上
PDOの紹介
PDOの紹介

第3回:データの検索

著者:Ilia Alshanetsky   2005/12/21
前のページ  1  2   3  次のページ
データ取得処理の向上

   データ取得処理をよりシンプルにして速度を向上させるためには、PDOのPDOStatementオブジェクトのfetchAll()メソッドを呼び出します。1つのレコードだけ取得する場合はfetch()メソッドの方が便利ですが、複数の結果を取得する場合はfetchAll()メソッドで全レコードを配列形式で取得することができます。それぞれの配列の要素は指定されたfetchモードによって配列かオブジェクトになります。

$rows = $db->query("SELECT id FROM foo LIMIT 1")->fetchAll();
print_r($rows);
⁄*
array (
     array(0 =>1, 'id'=>1)
)
*⁄

   fetch()メソッドと同じように、標準の取得モードはPDO_FETCH_BOTHです。取得する全レコードに対してfetch()メソッドを呼び出して、全レコードを格納する配列を作成する処理を一度に行うことで、fetchAll()メソッドはより簡単により速く全レコードのセットを取得することができます。

   データの取得結果が単一のカラムだけの場合は、処理を最適化することができます。この場合は配列で結果を取得するのではなく、PDO_FETCH_COLUMNモードを指定することで文字列形式で結果を取得することができます。

   fetchAll()メソッドと組み合わせると、今まで2次の配列で取得していた結果が1次の配列になります。例えば、MySQLでfoo_ではじまるテーブルの全リストを取得するのに、以下のような簡単なコードで実行することができます。

$tables = $db->query("SHOW TABLES LIKE 'foo_%'")
->fetchAll(PDO_FETCH_COLUMN);
print_r($tables);
⁄*
array(
     "foo_bar",
     "foo_baz",
     …
)
*⁄

   fetch()メソッドではPDO_FETCH_COLUMNモードがサポートされていますが、PDOでは同じ機能を実装しているfetchColumn()メソッドを使用することができます。デフォルトではこの関数はレコードセットの中で最初のカラムの値を文字列形式で返します。

   もし取得対象のカラムが最初のカラムではない場合は、オプションの引数でカラムの番号を指定することができます。カラムの場所を指定するときに、一番最初のカラムは0番目であることに注意しましょう。

$rows = $db->query("SELECT id FROM tbl");
while ($id = $db->fetchColumn()){
… }

   結果セットが1行の場合は、取得したPDOStatement オブジェクトに対して直接参照し、さらに関数を呼び出すことができます。この方法で上述のサンプルでもfetchAll()メソッドをquery()メソッドの結果に対して呼び出していますが、PHP 5のオブジェクトのサポートによって可能になった操作です。

$qry = "SELECT id FROM users WHERE login='".
$db->quote($_POST['login'])."' AND
passwd='".md5($_POST['pwd'])."'";
if ($db->query($qry)->fetchColumn()) {
     show_login_prompt();
exit;
} else {
     create_user_session();
}

   上記の例ではユーザの認証情報のチェックを行い、システムにログインできるかどうかをチェックする処理を簡単に記述するために、関数の戻り値に対する呼び出しを行っています。

前のページ  1  2   3  次のページ


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


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