CodeIgniter ユーザガイド 日本語版 Version 1.7.3


クエリ

$this->db->query();

クエリを実行するには、次のメソッドを使います:

$this->db->query('ここにクエリを記述');

query() メソッドは、「読み取り」タイプのクエリが実行されたときには、 結果を表示するために使用するデータベースの結果オブジェクトを返します。「書き込み」タイプの問い合わせを実行したときには、単純にクエリが成功したかどうかによって TRUE か FALSE が返ります。データを取得するときには、通常は、queryメソッドの結果を受け取る変数を次のように用意します:

$query = $this->db->query('ここにクエリを記述');

$this->db->simple_query();

これは、$this->db->query() メソッドが単純化されたものです。成功か失敗かをTRUE/FALSEで返します。 結果セットは「返しません」。クエリ時間の計測や、データのバインディングをコンパイルしたり、デバッグ用にクエリを保存することもありません。 これを使うと、クエリの単純な送信ができます。ほとんどのユーザは、このメソッドをまれにしか使用しないでしょう。

データベースプリフィックス(接頭辞)の手動追加

データベースプリフィックス(接頭辞)が設定済みの場合で、手動でプリフィックスを追加したいときは、以下のようにします。

$this->db->dbprefix('tablename');
// 出力: prefix_tablename

識別子の保護

多くのデータベースでは、テーブル名やフィールド名を保護すること - たとえば MySQLでは、バッククォート(バックチック)を使います - が推奨されます。Active Record のクエリは自動的に保護されますが、識別子を手動で保護する必要がある場合は、次を利用できます [訳注:識別子(テーブル名や列名など)が予約語の場合や、特殊文字が含まれる場合、たとえばMySQLでは、バッククォート「`」でそれらを囲む必要があります。こういった場合にこのメソッドを利用できます。]:

$this->db->protect_identifiers('table_name');

このメソッドは、データベース設定ファイルで指定したデータベースプリフィックス(接頭辞)をテーブル名に追加できます。これを利用するには、第2引数に TRUE (ブール値)を指定します:

$this->db->protect_identifiers('table_name', TRUE);

クエリのエスケープ処理

データベースにデータを送信する前にデータをエスケープ処理するのは、大変優れたセキュリティ上のプラクティスです。 CodeIgniter には、これを支援するメソッドが3つあります:

  1. $this->db->escape() このメソッドは、データの型を決定し、 文字列データだけをエスケープ処理します。また、自動でデータをシングルクォーテーションで囲むので、自分でそれをしないでください: $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
  2. $this->db->escape_str() このメソッドは、型を無視して渡されたデータをエスケープします。 ほとんどの場合はこれを使わず、上のメソッドを利用することになると思います。このメソッドは、次のように使用します: $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
  3. $this->db->escape_like_str() 文字列の中のLIKE句で使用されるワイルドカード('%', '_')についても適切にエスケープされるように、 文字列がLIKE条件で使用されるときには、このメソッドを使用するべきです。 $search = '20% raise';
    $sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";

クエリのバインディング

バインディングを使うと、システムにクエリを組み立てさせることで、クエリの構文を単純化することができます。次のような例があげられます:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick'));

クエリの中のクエスチョンマークは、queryメソッドの第2引数で指定した配列のデータに自動的に置き換わります。

バインディングを利用する第2の利点は、値が自動的にエスケープされ、安全なクエリが生成されるということです。手動をデータをエスケープするのを気に留める必要がなく、あなたに代わってエンジンが自動でそれを行ってくれます。