クエリ
$this->db->query();
クエリを実行するには、次のメソッドを使います:
$this->db->query('ここにクエリを記述');
query() メソッドは、「読み取り」タイプのクエリが実行されたときには、 結果を表示するために使用するデータベースの結果オブジェクトを返します。 「書き込み」タイプの問い合わせを実行したときには、単純にクエリが成功したかどうかによって TRUE か FALSE が返ります。データを取得するときには、通常は query メソッドの結果を受け取る変数を次のように用意します:
$query = $this->db->query('ここにクエリを記述');
$this->db->simple_query();
これは、$this->db->query() メソッドが単純化されたものです。成功か失敗かを TRUE/FALSE で返します。 結果セットは「返しません」。クエリ時間の計測や、データのバインディングをコンパイルしたり、デバッグ用にクエリを保存することもありません。 これを使うと、クエリの単純な送信ができます。ほとんどのユーザは、このメソッドをまれにしか使用しないでしょう。
データベースプリフィックス(接頭辞)を手動で扱う
データベースプリフィックス(接頭辞)が設定済みの場合で、ネイティブな SQL 文の使用でテーブル名にプリフィックスを追加したいときは、以下のようにします。
$this->db->dbprefix('tablename');
// 出力: prefix_tablename
何らかの理由で、新しく接続することなしにプログラムでプリフィックスを変更したい場合は、以下のメソッドを使います:
$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename');
// 出力: newprefix_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の利点は、値が自動的にエスケープされ、安全なクエリが生成されるということです。手動をデータをエスケープするのを気に留める必要がなく、あなたに代わってエンジンが自動でそれを行ってくれます。