セレクトクエリは常に 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(); ?>