クエリ
$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つあります:
- $this->db->escape() このメソッドは、データの型を決定し、
文字列データだけをエスケープ処理します。また、自動でデータをシングルクォーテーションで囲むので、自分でそれをしないでください:
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
- $this->db->escape_str() このメソッドは、型を無視して渡されたデータをエスケープします。
ほとんどの場合はこれを使わず、上のメソッドを利用することになると思います。このメソッドは、次のように使用します:
$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
- $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の利点は、値が自動的にエスケープされ、安全なクエリが生成されるということです。手動をデータをエスケープするのを気に留める必要がなく、あなたに代わってエンジンが自動でそれを行ってくれます。