クエリの生成と実行
この項では、ActiveRecordを利用せずに、開発者がSQLクエリをコーディングして処理する方法を解説しています。
「Active Record」を利用すれば、この項で解説されている機能は全て自動で処理されます。
データベース操作を100% 「Active Record」を用いて開発する場合は、この項の解説は それほど重要でないかもしれません。
SQLクエリの実行
SQLクエリの実行は、生成したデータベースオブジェクトから「query()」メソッドにSQLクエリ文字列を
指定して実行します。
(データベースオブジェクトの生成方法は「データベース接続」の項を参照してください。)
query($sql, $binds = FALSE, $return_object = TRUE)
第一引数にSQLクエリ文字列を指定します。
第二引数には、後に説明するSQLバンド生成のデータを指定します。
第三引数に「FALSE」を指定すると読込みSQLクエリの実行結果オブジェクトを返しません。 代わりにBool値(TRUE または、 FALSE)を返します。
「query()」メソッドでSQLクエリを実行すると、SQLキャッシュの対象となります。
(設定:「cache_on」)
また、「CI_Outputコアクラス」の「enable_profiler()」
メソッドで出力されるベンチマーク情報
(SQLクエリとその実行時間) としてキャッシュされます。
読込みSQL
引数に読込みSQLクエリのみ指定された「query()」メソッドは、SQLクエリの実行に成功すると、
その結果オブジェクトを返します。
SQLクエリの実行に失敗した場合は「FALSE」を返します。
$sql = 'SELECT * FROM `user_tbl`'; if ($result = $this->db->query($sql)) { // 成功処理 } else { // 失敗処理 }
書込みSQL
書込みSQLを指定して実行すると、成功時には「TRUE」、失敗時に「FALSE」を返します。
$sql = 'INSERT INTO `user_tbl` (`userid`, `name`) VALUES ('12345', 'TARO')'; if ($this->db->query($sql)) { // 成功処理 } else { // 失敗処理 }
simple_query($sql)
引数にSQLクエリ文字列を指定します。
simple_query()メソッドは「query()」メソッドとは違い、単純にSQLクエリを実行するだけで、
結果オブジェクトを返しません。
SQLクエリ実行成功時は「TRUE」、 失敗時は「FALSE」を返します。
また、SQLキャッシュやベンチマーク情報のキャッシュも行いません。
テーブル・フィールド名のエスケープ
SQLクエリを生成する際、テーブル名やフィールド名を動的に扱う場合は、これらをエスケースすることで そのSQLクエリは、安全、適切に実行させることができます。
protect_identifiers($item, $prefix_single = FALSE)
第一引数に、テーブル名やフィールド名のSQL識別子文字列、または、SQL識別子文字列の配列を
指定します。 配列で指定した場合は、配列の各要素がエスケープされ配列で返されます。
第二引数に、「TRUE」を指定すると、database.php設定ファイルの 「dbprefix」で設定したプリフィックスが付加されます。
- config/database.php
- controllers/User.php
- model/Table_model.php
: $db['default']['dbprefix'] = 'pre_'; :
public function user_list() { $table = 'user_tbl'; $columns = array( 'userid', 'name', ); $this->tbl_model->getData($table, $columns); // 省略 }
public function getData($table, $columns) { $table = $this->db->protect_identifiers($table, TRUE); if (is_array($columns)) { $colomns = implode(',', $this->db->protect_identifiers($columns)); } else { $colomns = $this->db->protect_identifiers($columns); } $sql = 'SELECT ' . $colomns . ' FROM ' . $table; if (($result = $this->db->query($sql)) && $result->num_rows() > 0) { /* $this->db->last_query(); */ // SELECT `userid`, `name` FROM `pre_user_tbl` return $result->result(); } return FALSE; }
データ文字列のエスケープ
SQLクエリの検索キー文字列や、INSERT, UPDATEなどに指定する「値」を動的に指定する場合、
安全、適切にSQLクエリを実行するには、エスケープ処理を行う必要があります。
escape($str) 一番上に戻る
引数に指定されたデータが文字列の場合、安全な文字列にエスケープ処理されます。
また、データがBool値の場合は、「0」、または、「1」
に変換され、「NULL」の場合は、
「'NULL'」として文字列に変換されます。
(SQLクエリ実行時はNULLデータとして扱われます。)
- ちなみに・・・
$val = "That's good."; $val = $this->db->escape($val); $sql = "INSERT INTO `comment_tbl` (`comment`) VALUES (" . $val . ")"; // INSERT INTO `comment_tbl` (`comment`) VALUES ('That\'s good.')
$val = FALSE; $val = $this->db->escape($val); $sql = "INSERT INTO `comment_tbl` (`comment`) VALUES (" . $val . ")"; // INSERT INTO `comment_tbl` (`comment`) VALUES (0)
$val = NULL; $vale = $this->db->escape($val); $sql = "INSERT INTO `comment_tbl` (`comment`) VALUES (" . $val . ")"; // INSERT INTO `comment_tbl` (`comment`) VALUES (NULL)
$val = 'NULL'; $vale = $this->db->escape($val); $sql = "INSERT INTO `comment_tbl` (`comment`) VALUES (" . $val . ")"; // INSERT INTO `comment_tbl` (`comment`) VALUES ('NULL')
escape_like_str($str) 一番上に戻る
引数に「LIKE」パターン検索で利用する検索キー文字列を指定します。
安全な文字列にエスケープ処理されるのと同時に「%」と「_」文字がエスケープされます。
$like = '0%'; $like = $this->db->escape_like_str($like); $sql = "SELECT * FROM `data_tbl` WHERE `rate` LIKE '%" . $like . "'"; // SELECT * FROM `data_tbl` WHERE `rate` LIKE '%0\%'
バインディング SQLクエリ生成
バインディングによるSQLクエリ生成方法では、複数の動的データを一度にセットしてSQLクエリ構文を
生成することができます。
また、この方法でSQLクエリを生成すると、動的に利用するデータは自動でエスケープ処理されるため
開発者はエスケープ処理について気にする必要はありません。
「query()」メソッドは、第二引数で指定された配列データを 全て適切にエスケープ処理を行い 第一引数で指定されたSQLクエリ文字列内の「?」と置き換えて、再生成したSQLクエリを実行します。
「?」文字は左から現れた順に、配列データの先頭から順に置き換えられていきます。
$sql = 'SELECT * FROM `user_tbl` ' . 'WHERE `prefecture` = ? ' . 'AND `age` > ? ' . 'AND `sex` = ? ' . 'AND `active` = ?'; $values = array( 'Tokyo', '19', 'm', TRUE, ); $this->db->query($sql, $values); // SELECT * FROM `user_tbl` // WHERE `prefecture` = 'Tokyo' // AND `age` > '19' // AND `sex` = 'm' // AND `active` = 1
INSERT・UPDATE SQLクエリ生成
データベースオブジェクトからは、「INSERT」SQLクエリ、及び、「UPDATE」SQLクエリを簡単に
生成するメソッドが用意されています。
insert_string($table, $data) 一番上に戻る
第一引数には、テーブル名を文字列で指定します。
第二引数には、テーブルにセットしたいデータをテーブルの各フィールド名と対応するように
連想配列で指定します。
指定されたテーブル名、 各フィールド名とデータは自動でエスケープ処理されます。
$values = array( 'userid' => '12345', 'name' => 'Taro', 'age' => 19, 'sex' => 'm', 'active' => TRUE, ); $sql = $this->db->insert_string('user_tbl', $values); // INSERT INTO `user_tbl` // (`userid`, `name`, `age`, `sex`, `active`) // VALUES // ('12345', 'Taro', 19, 'm', 1)
update_string($table, $data, $where) 一番上に戻る
第一引数にテーブル名を文字列で指定します。
第二引数には、テーブルにセットしたいデータをテーブルの各フィールド名と対応するように
連想配列で指定します。
第三引数には、WEHER句をフィールド名を添え字にして、それに対応するデータを構成する連想配列を指定します。 各要素は、「AND」で連結されます。
指定されたテーブル名、 各フィールド名とデータは自動でエスケープ処理されます。
$values = array( 'prefecture' => 'Osaka', 'age' => 20, 'sex' => 'm', ); $where = array( 'userid' => '12345', 'active' => TRUE, ); $sql = $this->db->update_string('user_tbl', $values, $where); // UPDATE `user_tbl` // SET `prefecture` = 'Osaka', `age` = 20 // WHERE userid = '12345' // AND active = 1