Symfoware

Symfowareについての考察blog

CodeIgniter 3 データベースの検索結果取得について(Database Reference - Generating Query Results)

CodeIgniter User Guide

Database ReferenceのGenerating Query Resultsについて調べてみます。
Generating Query Results



Generating Query Results



SQL文の実行結果を取得する方法についての解説です。

・配列として取得する方法
・1行ずつ取得する方法
・便利なヘルパーメソッド

について見てみます。




Result Arrays



・result()

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


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 結果を取得
  14.         foreach($query->result() as $row) {
  15.         
  16.             echo $row->name . '<br>';
  17.             echo $row->title . '<br>';
  18.             echo $row->email . '<br>';
  19.             echo '-------<br>';
  20.         }
  21.     }
  22.     
  23. }



550_01.png


※これは、result_object()メソッドのエイリアスです。


検索結果が0件になるクエリを実行する場合、num_rows()で検索結果が存在するか
確認することをお勧めします。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 結果を取得
  19.         foreach($query->result() as $row) {
  20.         
  21.             echo $row->name . '<br>';
  22.             echo $row->title . '<br>';
  23.             echo $row->email . '<br>';
  24.             echo '-------<br>';
  25.         }
  26.     }
  27.     
  28. }





resultの引数にクラス名を取得することで、そのクラスにマッピングすることもできます。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 結果を取得
  19.         foreach($query->result('User') as $row) {
  20.         
  21.             echo $row->name . '<br>';
  22.             echo $row->pretty_name() . '<br>';
  23.             echo '-------<br>';
  24.         }
  25.     }
  26.     
  27. }
  28. class User {
  29.     
  30.     public function pretty_name() {
  31.         return $this->name . 'ちゃん';
  32.     }
  33.     
  34. }



550_02.png



・result_array

検索結果の行をオブジェクトではなくarrayで取得したい場合、result_array()を使用します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 結果を取得
  19.         foreach($query->result_array() as $row) {
  20.         
  21.             echo $row['name'] . '<br>';
  22.             echo $row['title'] . '<br>';
  23.             echo $row['email'] . '<br>';
  24.             echo '-------<br>';
  25.         }
  26.     }
  27.     
  28. }







Result Rows



結果を1行だけ欲しい場合は、row()で取得します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 1行目の結果を取得
  19.         $row = $query->row();
  20.         echo $row->name . '<br>';
  21.         echo $row->title . '<br>';
  22.         echo $row->email . '<br>';
  23.     }
  24.     
  25. }



550_03.png




rowの引数に行番号を指定すると、その行の情報を取得できます。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 2行目の結果を取得
  19.         $row = $query->row(1);
  20.         echo $row->name . '<br>';
  21.         echo $row->title . '<br>';
  22.         echo $row->email . '<br>';
  23.     }
  24.     
  25. }



550_04.png




第二引数にクラス名を指定することで、任意のオブジェクトにマッピングできます。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 2行目の結果を取得
  19.         $row = $query->row(1, 'User');
  20.         echo $row->name . '<br>';
  21.         echo $row->pretty_name() . '<br>';
  22.     }
  23.     
  24. }
  25. class User {
  26.     
  27.     public function pretty_name() {
  28.         return $this->name . 'ちゃん';
  29.     }
  30.     
  31. }



550_05.png




・row_array

結果をオブジェクトではなくarrayで欲しい場合にはrow_arrayを使用します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 1行目の結果を取得
  19.         $row = $query->row_array();
  20.         echo $row['name'] . '<br>';
  21.         echo $row['title'] . '<br>';
  22.         echo $row['email'] . '<br>';
  23.     }
  24.     
  25. }



550_06.png



rowと同様、取得する行数の指定も行えます。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 検索結果があるかチェック
  14.         if ($query->num_rows() <= 0) {
  15.             return;
  16.         }
  17.         
  18.         // 2行目の結果を取得
  19.         $row = $query->row_array(1);
  20.         echo $row['name'] . '<br>';
  21.         echo $row['title'] . '<br>';
  22.         echo $row['email'] . '<br>';
  23.     }
  24.     
  25. }



550_07.png



この他に、最初の行、最後の行、次の行、前の行を取得するメソッドが用意されています。


  1. $row = $query->first_row()
  2. $row = $query->last_row()
  3. $row = $query->next_row()
  4. $row = $query->previous_row()




上記の結果は全てオブジェクトで取得できます。
arrayが良い場合は、引数に'array'を指定します。


  1. $row = $query->first_row(‘array’)
  2. $row = $query->last_row(‘array’)
  3. $row = $query->next_row(‘array’)
  4. $row = $query->previous_row(‘array’)




※これらのメソッドは、結果を全てメモリに展開しているから行える操作です。
大量の検索結果を扱う場合は、unbuffered_rowを使用します。



・unbuffered_row()

unbuffered_rowを使用すると1行ずつフェッチしてくれます。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // unbuffered_rowで一行ずつフェッチする
  14.         while ($row = $query->unbuffered_row()) {
  15.             echo $row->name . '<br>';
  16.             echo $row->title . '<br>';
  17.             echo $row->email . '<br>';
  18.             echo '-------<br>';
  19.         }
  20.     }
  21.     
  22. }



550_08.png


デフォルトではオブジェクト形式で行が取得できます。
arrayが良い場合は、引数に'array'を指定します。


  1. $query->unbuffered_row();             // object
  2. $query->unbuffered_row('object');     // object
  3. $query->unbuffered_row('array');        // associative array









Result Helper Methods



・num_rows()

検索結果の行数を返します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT name,title,email FROM my_table");
  12.         
  13.         // 取得した行数を表示
  14.         echo $query->num_rows();
  15.     }
  16.     
  17. }



550_09.png



・num_fields()

取得した結果の列数を返します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT * FROM my_table");
  12.         
  13.         // 取得した行数を表示
  14.         echo $query->num_fields();
  15.     }
  16.     
  17. }



550_10.png



・list_fields

取得した結果のフィールド名を取得します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT * FROM my_table");
  12.         
  13.         foreach($query->list_fields() as $field) {
  14.             echo $field . '<br>';
  15.         }
  16.         
  17.         
  18.     }
  19.     
  20. }



550_11.png





・free_result()

PHPはスクリプト実行後自動的にメモリを開放します。
しかし、大量の検索結果をメモリに展開して処理する場合は、任意のタイミングで
メモリを開放したい時があります。

そんな時にfree_result()を使用します。


  1. $query = $this->db->query('SELECT title FROM 巨大な集計メインテーブル');
  2. foreach ($query->result() as $row){
  3.     // 何かの集計処理
  4. }
  5. // メモリ開放
  6. $query->free_result();
  7. $query2 = $this->db->query('SELECT name FROM 巨大な集計サブテーブル');
  8. foreach ($query2->result() as $row){
  9.     // 何かの集計処理
  10. }
  11. // メモリ開放
  12. $query2->free_result();





・data_seek()

unbuffered_row()で任意の行のデータを取り出したいとき、
data_seek()で取得したいデータ行までスキップしてから取り出します。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // SQLを実行
  11.         $query = $this->db->query("SELECT * FROM my_table");
  12.         
  13.         // 2行目に移動
  14.         $query->data_seek(1);
  15.         
  16.         // データ取得
  17.         $row = $query->unbuffered_row();
  18.         echo $row->name . '<br>';
  19.         echo $row->title . '<br>';
  20.         echo $row->email . '<br>';
  21.         
  22.     }
  23.     
  24. }




SQLiteはseekをサポートしていないようでエラーになりました。



CodeIgniter 3のユーザーガイド(User Guide)まとめ



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/02/18(水) 22:40:39|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHPでzipファイルを作成する(ZipArchive) | ホーム | CodeIgniter 3 データベースの接続サンプル(Database Reference - Quick Start: Usage Examples)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1630-e4bc3be0
この記事にトラックバックする(FC2ブログユーザー)