このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0208

クエリの生成と実行

 この項では、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キャッシュやベンチマーク情報のキャッシュも行いません。

    $this->db->simple_query('DO RELEASE_LOCK('lock')');

テーブル・フィールド名のエスケープ

 SQLクエリを生成する際、テーブル名やフィールド名を動的に扱う場合は、これらをエスケースすることで そのSQLクエリは、安全、適切に実行させることができます。

protect_identifiers($item, $prefix_single = FALSE)

 第一引数に、テーブル名やフィールド名のSQL識別子文字列、または、SQL識別子文字列の配列を
指定します。 配列で指定した場合は、配列の各要素がエスケープされ配列で返されます。

 第二引数に、「TRUE」を指定すると、database.php設定ファイルの 「dbprefix」で設定したプリフィックスが付加されます。

    • config/database.php
       :
    $db['default']['dbprefix'] = 'pre_';
       :
    
    • controllers/User.php
        public function user_list() {
    
            $table = 'user_tbl';
            $columns = array(
                'userid',
                'name',
            );
    
            $this->tbl_model->getData($table, $columns);
    
            // 省略
        }
    
    • model/Table_model.php
        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