結果セットの取得

~ Result sets 和訳 ~

セレクトクエリは常に 0 個以上の結果セットオブジェクトを返します。結果セットからデータを取得するには、ケースに応じていくつかの方法があります。いちばんよく使われる方法は、foreach() ループを使った繰り返し処理です。

<?php
$result = db_query("SELECT nid, title FROM {node}");
foreach ($result as $record) {
  // それぞれの $record に対して処理を行います。
  $node = node_load($record->nid);
}
?>

結果セットをどのような形で使用したいのかによって、他にもいくつか方法があります。1行だけ取得したい場合は fetch を使います。

<?php
$record = $result->fetch();        // デフォルトのフェッチモードです。
$record = $result->fetchObject();  // オブジェクトとして取得します。
$record = $result->fetchAssoc();   // 連想配列として取得します。
?>

行が存在しない場合は FALSE が返されます。分かりやすさの観点から言うと、一般的には fetch() の使用はなるべく避け、fetchObject() か fetchAssoc() を使用すべきです。PDO のサポートする他のフェッチモードを使いたい場合などは、fetch() を使用します。

結果セットから単に1つのフィールドの値を取得する場合は、このようにします。

<?php
$record = $result->fetchField($column_index);
?>

$column_index のデフォルトの値は 0 、つまり最初のフィールドです。

行の数を取得したい場合は、このようにします。

<?php
$number_of_rows = $result->rowCount();
?>

すべての結果を1つの配列に収めたいときは、次のいずれかの方法を使います。

<?php
// すべての行を取得して stdClass オブジェクトの添字配列に格納する
$result->fetchAll();

// すべての行を取得してフィールドをキーとした連想配列に格納する
$result->fetchAllAssoc($field);

// 2カラムの結果セットを field 1 => field 2 のような連想配列にする
$result->fetchAllKeyed();
// 次のように2つのフィールドを指定することもできます
$result->fetchAllKeyed(0,2); // field 0 => field 2 となります
$result->fetchAllKeyed(1,0); // field 1 => field 0 となります

// 1つのカラムの結果セットを配列に格納する
$result->fetchCol();
// 次のようにカラムを指定することもできます。デフォルトは最初のカラムです
$result->fetchCol($column_index);
?>

fetchAll() と fetchAllAssoc() はデフォルトでクエリにセットされたフェッチモードで取得します。それは新たにフェッチモード定数(添字配列、連想配列、オブジェクト)を渡すことで変更できます。fetchAll() の場合は第1引数に、fetchAllAssoc() の場合は第2引数に渡します。

PHPはオブジェクトを返す際のメソッドチェーンをサポートしているので、次のように $result 変数を省略した書き方をするのが一般的です:

<?php
// nid => title の形で連想配列を取得します。
$nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed();

// 1行のレコードを取得します。
$node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchObject();

// 1つの値を取得します。
$title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchField();
?>
コア: 
Drupal7