Database APIを自分用にまとめてみた ~Static Queries~

はじめに

こちらの記事の第2弾です。

今回はStatic Queries(静的クエリ)の項目をまとめていきます。

※ 英語で書かれているドキュメントを日本語に訳しながらまとめています。よって、翻訳ミスやニュアンスの違い等があるかもしれないことをご承知おきください。

Static Queriesとは

概要

DB接続オブジェクトのquery()メソッドを使用した静的クエリです。
Select文を実行するのに使います。

このメソッドで実行されたクエリは、ほぼそのままDBに渡されます。

使用するメソッド

Drupal::database()query()メソッドです。

以下、メソッドの引数をテーブルにまとめました。

変数名 概要
$query 実行するクエリ。必要に応じてプレースホルダーを使用し、全てのテーブル名を中括弧で囲うこと。
$arg クエリに代入するプレースホルダーの値になる配列。
$options クエリの動作を制御するオプションの配列。

実行例

実際にテストコードを書いて実行してみました。

public function staticQuery(
    int $uid,
    string $title,
    string $body,
): void {
    Drupal::database()->query(
        "INSERT INTO {articles} VALUES (:id, :uid, :title, :body)",
        [
            'id' => 1,
            'uid' => $uid,
            'title' => $title,
            'body' => $body
        ]
    );

    $selectQuery = Drupal::database()->query("SELECT * FROM {articles}");
    $result = $selectQuery->fetchAssoc();
    foreach ($result as $key => $value) {
        echo 'key: '.$key.', value: '.$value."\n";
    }
}

staticQuery(
    1,
    'タイトル',
    '本文本文本文本文本文本文本文本文'
);

実行結果は以下の通りです。

key: uid, value: 1
key: title, value: タイトル
key: body, value: 本文本文本文本文本文本文本文本文

Insert文とSelect文が実行できていますね!

注意点

「このメソッドで実行されたクエリは、ほぼそのままDBに渡される」という性質上、ユーザー入力に対するサニタイズを忘れると、アプリケーションがSQLインジェクション攻撃に晒される可能性があります。

公式ドキュメント内では、インジェクション攻撃を防ぐ工夫として以下のような方法が挙げられていました。

  • 非常に単純なSelectクエリにのみ静的クエリを使用し、それ以外は動的クエリを使用するようにする
  • 公式ドキュメントを確認し、ベストプラクティスに従ったクエリを作成する。

静的クエリは動的クエリと比べてパフォーマンスが高いため、適切な場所で利用することが大切なようです。

最後に

今回はStatic Queriesについてをまとめました。

静的なクエリは、現状あまり実務では利用してこなかった部分なので、実際にコードを書いて動作確認できたのは勉強になりました。

次回はDynamic Queriesについて記事にしようと思います。

Romy(ろみぃ)

歌とゲームと本が好きな人間。ドラゴンになりたい。
不定期で記事を更新していきます。
今後、ブログ以外にもコンテンツ追加していく予定。

© Romy 2024