Drupal 7 でのデータベース操作 - レッスン 3 - 静的クエリ(SELECT)
Drupal でのクエリの最も一般的な形式は静的クエリです。静的クエリは、そのままの形で直接データベースに渡されます。静的にできるのは SELECT クエリだけです。
静的クエリは、ごく単純な操作にのみ使ってください。より複雑な、動的に構築される、または変更可能なクエリには、動的クエリを使うべきです。
静的クエリを実行する最も簡単な方法は、query メソッドを使うことです:
query("SELECT nid, title FROM {node}");
?>
好ましいアプローチは、手続き的なラッパーを使うことです:
この db_query() の呼び出しは次と同等です:
query("SELECT nid, title FROM {node}");
?>
db_query() を使う方が、Database::getConnection() を直接呼び出すよりも優れています。
db_query() は 3 つの引数を受け取ります。最初は SQL クエリ文字列で、プレースホルダーとテーブル名は波括弧で囲みます。2 番目はプレースホルダーの配列です。3 番目(任意)は、クエリ実行のオプションの配列です。
プレフィックス
静的クエリでは、すべてのテーブル名を波括弧 {} で囲むべきです。これにより Drupal がテーブルプレフィックスを適用でき、site1_ や site2_ のようなテーブル名プレフィックスでデータベースを共有するマルチサイトインストールをサポートします。
プレースホルダー
プレースホルダーはコロン(たとえば :created)で示され、ユーザー入力を SQL 構文から分離し、SQL インジェクションを防ぐのに役立ちます。
:created", array(
':created' => REQUEST_TIME - 3600,
));
?>
この例では、クエリは過去 1 時間以内に作成されたすべてのノードを取得します。:created プレースホルダーは計算された時刻に置き換えられます。
プレースホルダーの値は、インラインで、または事前定義された配列を介して提供できます。値が繰り返される場合でも、すべて一意の名前を持たなければなりません。db_ で始まる予約名は使うべきではありません。
注意: 文字列リテラルを扱う場合を除き、プレースホルダーを引用符で囲まないでください。例:
'page',
));
// CORRECT:
$result = db_query("SELECT nid, title FROM {node} WHERE type = :type", array(
':type' => 'page',
));
?>
プレースホルダーはテーブル名や列名には使えません――値にのみ使えます。
プレースホルダーとしての配列
Drupal のデータベースレイヤーは配列プレースホルダーをサポートします。配列が渡されると、プレースホルダーは自動的にカンマ区切りのリストに展開されます。これにより、各プレースホルダーを手動で数えて名付ける必要がなくなります。
array(13, 42, 144)));
// Which becomes:
db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array(
':nids_1' => 13,
':nids_2' => 42,
':nids_3' => 144,
));
// Equivalent to:
db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)");
?>
クエリオプション
db_query() の 3 番目の引数は、クエリの実行方法を制御するクエリオプションの配列です。最も一般的なオプションは次のとおりです:
- 'target' — 読み取りレプリカ用の
'slave'など、データベースのターゲットを定義します(デフォルトは'default')。 - 'fetch' — 結果の取得方法を定義します。サポートされる値には次のものがあります:
- PDO::FETCH_OBJ — オブジェクトとして(デフォルト)
- PDO::FETCH_ASSOC — 連想配列として
- PDO::FETCH_NUM — 数値配列として
- PDO::FETCH_BOTH — 連想配列と数値配列の両方として
- クラス名の文字列 — そのクラスのオブジェクトとして
読み取りレプリカを使い、結果を連想配列として取得する例:
'slave',
'fetch' => PDO::FETCH_ASSOC,
));
?>