CodeIgniter 3 データベースの検索結果取得について(Database Reference - Generating Query Results)
CodeIgniter User GuideDatabase ReferenceのGenerating Query Resultsについて調べてみます。
Generating Query Results
Generating Query Results
SQL文の実行結果を取得する方法についての解説です。
・配列として取得する方法
・1行ずつ取得する方法
・便利なヘルパーメソッド
について見てみます。
Result Arrays
・result()
結果をオブジェクトの配列で取得します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 結果を取得
- foreach($query->result() as $row) {
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- echo '-------<br>';
- }
- }
- }

※これは、result_object()メソッドのエイリアスです。
検索結果が0件になるクエリを実行する場合、num_rows()で検索結果が存在するか
確認することをお勧めします。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 結果を取得
- foreach($query->result() as $row) {
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- echo '-------<br>';
- }
- }
- }
resultの引数にクラス名を取得することで、そのクラスにマッピングすることもできます。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 結果を取得
- foreach($query->result('User') as $row) {
- echo $row->name . '<br>';
- echo $row->pretty_name() . '<br>';
- echo '-------<br>';
- }
- }
- }
- class User {
- public function pretty_name() {
- return $this->name . 'ちゃん';
- }
- }

・result_array
検索結果の行をオブジェクトではなくarrayで取得したい場合、result_array()を使用します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 結果を取得
- foreach($query->result_array() as $row) {
- echo $row['name'] . '<br>';
- echo $row['title'] . '<br>';
- echo $row['email'] . '<br>';
- echo '-------<br>';
- }
- }
- }
Result Rows
結果を1行だけ欲しい場合は、row()で取得します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 1行目の結果を取得
- $row = $query->row();
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- }
- }

rowの引数に行番号を指定すると、その行の情報を取得できます。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 2行目の結果を取得
- $row = $query->row(1);
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- }
- }

第二引数にクラス名を指定することで、任意のオブジェクトにマッピングできます。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 2行目の結果を取得
- $row = $query->row(1, 'User');
- echo $row->name . '<br>';
- echo $row->pretty_name() . '<br>';
- }
- }
- class User {
- public function pretty_name() {
- return $this->name . 'ちゃん';
- }
- }

・row_array
結果をオブジェクトではなくarrayで欲しい場合にはrow_arrayを使用します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 1行目の結果を取得
- $row = $query->row_array();
- echo $row['name'] . '<br>';
- echo $row['title'] . '<br>';
- echo $row['email'] . '<br>';
- }
- }

rowと同様、取得する行数の指定も行えます。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 検索結果があるかチェック
- if ($query->num_rows() <= 0) {
- return;
- }
- // 2行目の結果を取得
- $row = $query->row_array(1);
- echo $row['name'] . '<br>';
- echo $row['title'] . '<br>';
- echo $row['email'] . '<br>';
- }
- }

この他に、最初の行、最後の行、次の行、前の行を取得するメソッドが用意されています。
- $row = $query->first_row()
- $row = $query->last_row()
- $row = $query->next_row()
- $row = $query->previous_row()
上記の結果は全てオブジェクトで取得できます。
arrayが良い場合は、引数に'array'を指定します。
- $row = $query->first_row(‘array’)
- $row = $query->last_row(‘array’)
- $row = $query->next_row(‘array’)
- $row = $query->previous_row(‘array’)
※これらのメソッドは、結果を全てメモリに展開しているから行える操作です。
大量の検索結果を扱う場合は、unbuffered_rowを使用します。
・unbuffered_row()
unbuffered_rowを使用すると1行ずつフェッチしてくれます。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // unbuffered_rowで一行ずつフェッチする
- while ($row = $query->unbuffered_row()) {
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- echo '-------<br>';
- }
- }
- }

デフォルトではオブジェクト形式で行が取得できます。
arrayが良い場合は、引数に'array'を指定します。
- $query->unbuffered_row(); // object
- $query->unbuffered_row('object'); // object
- $query->unbuffered_row('array'); // associative array
Result Helper Methods
・num_rows()
検索結果の行数を返します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT name,title,email FROM my_table");
- // 取得した行数を表示
- echo $query->num_rows();
- }
- }

・num_fields()
取得した結果の列数を返します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT * FROM my_table");
- // 取得した行数を表示
- echo $query->num_fields();
- }
- }

・list_fields
取得した結果のフィールド名を取得します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT * FROM my_table");
- foreach($query->list_fields() as $field) {
- echo $field . '<br>';
- }
- }
- }

・free_result()
PHPはスクリプト実行後自動的にメモリを開放します。
しかし、大量の検索結果をメモリに展開して処理する場合は、任意のタイミングで
メモリを開放したい時があります。
そんな時にfree_result()を使用します。
- $query = $this->db->query('SELECT title FROM 巨大な集計メインテーブル');
- foreach ($query->result() as $row){
- // 何かの集計処理
- }
- // メモリ開放
- $query->free_result();
- $query2 = $this->db->query('SELECT name FROM 巨大な集計サブテーブル');
- foreach ($query2->result() as $row){
- // 何かの集計処理
- }
- // メモリ開放
- $query2->free_result();
・data_seek()
unbuffered_row()で任意の行のデータを取り出したいとき、
data_seek()で取得したいデータ行までスキップしてから取り出します。
- <?php
- class Sample extends CI_Controller {
- public function index() {
- // データベースに接続
- // $this->dbにコネクションが作成される
- $this->load->database();
- // SQLを実行
- $query = $this->db->query("SELECT * FROM my_table");
- // 2行目に移動
- $query->data_seek(1);
- // データ取得
- $row = $query->unbuffered_row();
- echo $row->name . '<br>';
- echo $row->title . '<br>';
- echo $row->email . '<br>';
- }
- }
SQLiteはseekをサポートしていないようでエラーになりました。
CodeIgniter 3のユーザーガイド(User Guide)まとめ
- 関連記事
-
- JenkinsとGitBucketを連携し、CodeIgniterのテストを自動実行する(GitBucket Plugin)
- PHPでzipファイルを作成する(ZipArchive)
- CodeIgniter 3 データベースの検索結果取得について(Database Reference - Generating Query Results)
- CodeIgniter 3 データベースの接続サンプル(Database Reference - Quick Start: Usage Examples)
- CodeIgniter 3でSQLite3を使用する(Debian 7 + php-fpm)
コメント