logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

Drupal 7 でのデータベース操作 - レッスン 3 - 静的クエリ(SELECT)

17/04/2025, by Ivan

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 — 連想配列と数値配列の両方として
    • クラス名の文字列 — そのクラスのオブジェクトとして

詳細:PDO::fetch のドキュメント

読み取りレプリカを使い、結果を連想配列として取得する例:

 'slave',
  'fetch' => PDO::FETCH_ASSOC,
));
?>