Codeigniter:クエリ実行結果を取得する方法

Codeigniterクエリを実行した際の実行結果データ取得する方法をメモします。

実行結果のデータはオブジェクト配列で取得することができます。

下記に簡単な使用方法を記載します。


クエリ実行結果の取得方法

データベースの接続を行います。

$this->load->database();

クエリを実行します。

$sql = "SELECT id, name FROM user;";
$query = $this->db->query($sql);

result()メソッドを使用した場合

実行結果をオブジェクトの配列で取得します。

if ($query->num_rows() > 0) {
	$res = $query->result();
}

取得データ例

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => name1
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => name2
        )

        (省略)
)

result_array()メソッドを使用した場合

実行結果を配列で取得します。

if ($query->num_rows() > 0) {
	$res = $query->result_array();
}

取得データ例

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => name1
        )

    [1] => Array
        (
            [id] => 2
            [name] => name2
        )

        (省略)
)

row()メソッドを使用した場合

一つの実行結果をオブジェクトの配列で取得します。
複数データがある場合は、最初の行を取得します。

if ($query->num_rows() > 0) {
	$res = $query->row();
}

取得データ例

stdClass Object
(
    [id] => 1
    [name] => name1
)

複数行データがあり、取得する行を指定したい場合は
行番号を第1引数に指定します。

$res = $query->row(2);

row_array()メソッドを使用した場合

一つの実行結果を配列で取得します。
複数データがある場合は、最初の行を取得します。

if ($query->num_rows() > 0) {
	$res = $query->row_array();
}

取得データ例

Array
(
    [id] => 1
    [name] => name1
)

複数行データがあり、取得する行を指定したい場合は
行番号を第1引数に指定します。

$res = $query->row_array(2);

それぞれの用途によって使い分けるといいと思います。

Codeigniter:フラッシュデータの追加・取得

Codeigniterフラッシュデータを使用する時の使用方法をメモします。

システムで保存や削除などのメッセージを出力する場合などに、一度だけ出力したいという時に非常に便利です。
一度読み込まれたデータは削除されるので、再度読み込んでも取得できません。


フラッシュデータの使用方法

セッションクラスをロードします。

$this->load->library('session');

・フラッシュデータを追加する場合

セッションクラスの「set_flashdata」を使用します。

$this->session->set_flashdata('save_message', '保存しました。');

・フラッシュデータを取得する場合

セッションクラスの「flashdata」を使用します。

$message = $this->session->flashdata('save_message');

「$message」には、下記の値が格納されます。

保存しました。

Codeigniter:インサートした行のIDを取得

Codeigniterデータベースに行を挿入する時は、「$this->db->insert()」を使用します。
データを挿入する場合は、下記のようにテーブル名とデータ配列を設定し実行します。

$this->db->insert('table', $data);

「$this->db->insert()」を実行後に挿入した行のIDを取得したい場合があります。

ID取得する場合は、クエリヘルパーメソッドの「$this->db->insert_id()」を使用すると、
データベースインサートした行のIDを取得することができます。


$this->db->insert_id()

データベースに挿入した行のIDを取得します。


インサートした行のIDを取得

インサートを行った後に「$this->db->insert_id()」記述します。

$data = array(
	'name' = 'テスト',
	'address' = '東京都',
	'tel' = '000-0000-0000'
);

$this->db->insert('table', $data);

$id = $this->db->insert_id();

「$id」に挿入した行のIDが格納されるので、IDを取得することができます。


Codeigniter:セッションクラスの使用方法

Codeigniterセッションを使用する場合、セッションクラスを使用すると簡単にデータを操作することができます。

データの格納や取得など色々と使う場面が多いので、Codeigniterセッションクラス使用方法をメモします。


セッションクラス

セッションクラスを使用する場合は、下記のコードを記述しセッションクラスを使用できるようにします。
下記をロードしないとセッションクラスを使用することができないので注意です。

$this->load->library('session');

セッションを格納

単体の値を格納する場合は下記のように記述します。

$this->session->set_userdata('user_name', 'test');

複数の値を格納する場合は配列で値を渡します。

$this->session->set_userdata(array('user_id' => 1, 'user_name' => 'test'));

配列ごとセッションに格納する場合は下記のように記述します。

$user_data['user_id'] = 1;
$user_data['user_name'] = 'test';
$user_data['user_item'] = 'hoge';

$this->session->set_userdata(array('user_session' => $user_data));

セッションを取得

取得したいセッションのキーを指定して取得します。

$user_name = $this->session->userdata('user_name');

全てのセッション情報を取得する場合は下記のように記述します。

$all_data = $this->session->all_userdata();

セッションを削除

セッションに格納したデータをキーを指定して削除します。

$this->session->unset_userdata('user_name');

セッションを破棄

セッションに格納した情報をクリアする場合に使用します。

$this->session->sess_destroy();

セッションはデータベースに格納することも可能です。
その場合はデータベースを作成し、「application/config/config.php」をデータベースを使用するように変更します。

Codeigniter:クエリからCSVダウンロードした時のCSVデータを変更

CodeigniterでクエリからCSVダウンロードを行った際に、データベースユーティリティクラスの「csv_from_result」を使用してCSVデータを取得しました。
「csv_from_result」で取得したデータを参照すると行の末尾にカンマが入ってしまいます。また、最終行に改行が入ってしまいます。
「行の末尾のカンマ」や「最終行に改行」を入れたくなかったので、「csv_from_result」を変更してCSVデータを取得しました。
その時に行った処理をメモします。


csv_from_result

データベースユーティリティクラスの「csv_from_result」は下記のファイルに記載されています。

system/database/DB_utility.php

クエリの結果からCSVを生成します。

    /**
     * Generate CSV from a query result object
     *
     * @access    public
     * @param    object    The query result object
     * @param    string    The delimiter - comma by default
     * @param    string    The newline character - \n by default
     * @param    string    The enclosure - double quote by default
     * @return    string
     */
    function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
    {
        if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
        {
            show_error('You must submit a valid result object');
        }

        $out = '';

        // First generate the headings from the table column names
        foreach ($query->list_fields() as $name)
        {
            $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
        }

        $out = rtrim($out);
        $out .= $newline;

        // Next blast through the result array and build out the rows
        foreach ($query->result_array() as $row)
        {
            foreach ($row as $item)
            {
                $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
            }
            $out = rtrim($out);
            $out .= $newline;
        }

        return $out;
    }

■ 変更内容

新しくhelperを作成します。
今回は「csvdata_helper.php」というヘルパーを作成、「csv_from_result」のソースをコピーし、下記のように変更しました。
行の末尾のカンマと最終行の改行を削除するように変更してます。

・ヘルパー(csvdata_helper.php)

if ( ! function_exists('csv_from_result'))
{
    function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
    {
        if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
        {
            show_error('You must submit a valid result object');
        }

        $out = '';

        // First generate the headings from the table column names
        foreach ($query->list_fields() as $name)
        {
            $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
        }

        $out = rtrim($out);
        // 行の末尾のカンマを削除
        $out = rtrim($out, $delim);
        $out .= $newline;

        // Next blast through the result array and build out the rows
        foreach ($query->result_array() as $row)
        {
            foreach ($row as $item)
            {
                $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
            }
            $out = rtrim($out);
            // 行の末尾のカンマを削除
            $out = rtrim($out, $delim);
            $out .= $newline;
        }

        // 最終行に改行を削除
        $out = rtrim($out, $newline);
        return $out;
    }
}

コントローラー側でCSVデータを取得する際に新しく作成したヘルパーの「csv_from_result」を呼び出し、CSVデータを取得します。

・コントローラー

    // 作成したヘルパーを読み込む
    $this->load->helper(array('download', 'csvdata'));

    // クエリデータ取得
    $query = $this->db->query('SQL文');

    // ヘルパーに追加した関数を呼び出し、CSVデータ取得
    $data = csv_from_result($query);

    force_download('hoge.csv', $data);

上記方法で「行の末尾のカンマ」や「最終行に改行」が入らないようにCSVデータを出力することができます。