Symfoware

Symfowareについての考察blog

CodeIgniter 3 データベースの接続サンプル(Database Reference - Quick Start: Usage Examples)

CodeIgniter User Guide

Database ReferenceのQuick Start: Usage Examplesについて調べてみます。
Quick Start: Usage Examples




Initializing the Database Class



データベースにはSQLiteを使用することにしました。
こちらで行ったマイグレーション後のデータベースを使用し、テストしてみます。
CodeIgniter 3でSQLite3を使用する(Debian 7 + php-fpm)


$this->load->database();



とすることで、デフォルトとして指定されているデータベースに接続します。

ロードを実行すると、$this->dbというオブジェクトが暗黙に作成されます。
これを通じでデータベースにアクスします。





Standard Query With Multiple Results (Object Version)



SQL文を実行し、結果をオブジェクトとして取得してみます。


  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.         // result()で、オブジェクト形式で結果を取得
  14.         foreach ($query->result() as $row) {
  15.             
  16.             // データはアロー演算子で取得
  17.             echo $row->name . '<br>';
  18.             echo $row->title . '<br>';
  19.             echo $row->email . '<br>';
  20.             
  21.             echo '----------<br>';
  22.         }
  23.         
  24.         // データ件数を表示
  25.         echo 'Total Results: ' . $query->num_rows();
  26.     }
  27.     
  28. }




登録しているデータが取得出来ました。

549_01.png





Standard Query With Multiple Results (Array Version)



オブジェクトではなく、連想配列で行の情報を取得したい場合は、
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.         // result_array()で、連想配列で結果を取得
  14.         foreach ($query->result_array() as $row) {
  15.             
  16.             // データは通常のハッシュ形式で渡される
  17.             echo $row['name'] . '<br>';
  18.             echo $row['title'] . '<br>';
  19.             echo $row['email'] . '<br>';
  20.             
  21.             echo '----------<br>';
  22.         }
  23.         
  24.         // データ件数を表示
  25.         echo 'Total Results: ' . $query->num_rows();
  26.     }
  27.     
  28. }




結果はオブジェクト形式で取得したものと同じになります。





Testing for Results



データが取得できた時だけ処理を実行したい場合、
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 WHERE email = 'a'");
  12.         
  13.         if ($query->num_rows() > 0) {
  14.             // result_array()で、連想配列で結果を取得
  15.             foreach ($query->result_array() as $row) {
  16.                 
  17.                 // データは通常のハッシュ形式で渡される
  18.                 echo $row['name'] . '<br>';
  19.                 echo $row['title'] . '<br>';
  20.                 echo $row['email'] . '<br>';
  21.                 
  22.                 echo '----------<br>';
  23.             }
  24.         } else {
  25.             echo '検索結果0件です<br>';
  26.         }
  27.         
  28.         // データ件数を表示
  29.         echo 'Total Results: ' . $query->num_rows();
  30.     }
  31.     
  32. }




549_02.png


検索結果0件の状態で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 WHERE email = 'a'");
  12.         
  13.         // result_array()で、連想配列で結果を取得
  14.         foreach ($query->result_array() as $row) {
  15.             
  16.             // データは通常のハッシュ形式で渡される
  17.             echo $row['name'] . '<br>';
  18.             echo $row['title'] . '<br>';
  19.             echo $row['email'] . '<br>';
  20.             
  21.             echo '----------<br>';
  22.         }
  23.         
  24.         // データ件数を表示
  25.         echo 'Total Results: ' . $query->num_rows();
  26.     }
  27.     
  28. }



549_03.png





Standard Query With Single Result



検索結果から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 LIMIT 1");
  12.         
  13.         // 先頭行を取得し、結果を表示
  14.         $row = $query->row();
  15.         
  16.         echo $row->name . '<br>';
  17.         echo $row->title . '<br>';
  18.         echo $row->email . '<br>';
  19.         
  20.     }
  21.     
  22. }



549_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 WHERE email = 'a'");
  12.         
  13.         // 先頭行を取得し、結果を表示
  14.         $row = $query->row();
  15.         
  16.         echo $row->name . '<br>';
  17.         echo $row->title . '<br>';
  18.         echo $row->email . '<br>';
  19.         
  20.     }
  21.     
  22. }



549_05.png


前述のnum_rows()で結果を確認するか、$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 LIMIT 1");
  12.         
  13.         // 先頭行を取得し、結果を表示
  14.         $row = $query->row();
  15.         
  16.         if ($row) {
  17.             echo $row->name . '<br>';
  18.             echo $row->title . '<br>';
  19.             echo $row->email . '<br>';
  20.         }
  21.     }
  22.     
  23. }








Standard Query With Single Result (Array version)



検索結果の先頭行をオブジェクト形式ではなく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 LIMIT 1");
  12.         
  13.         // 先頭行をarrayで取得し、結果を表示
  14.         $row = $query->row_array();
  15.         
  16.         echo $row['name'] . '<br>';
  17.         echo $row['title'] . '<br>';
  18.         echo $row['email'] . '<br>';
  19.     }
  20.     
  21. }







Standard Insert



Insertも$this->db->queryで実行できます。
$this->db->escapeで、SQLのエスケープが行えるようです。


  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 = "INSERT INTO my_table (name,title,email) VALUES (";
  11.         $sql .= $this->db->escape("名前") . ",";
  12.         $sql .= $this->db->escape("チーム名") . ",";
  13.         $sql .= $this->db->escape("email's@example.com");
  14.         $sql .= ")";
  15.         
  16.         // SQLを実行
  17.         $query = $this->db->query($sql);
  18.         
  19.         // 更新件数を表示
  20.         echo $this->db->affected_rows();
  21.     }
  22.     
  23. }




549_06.png





Query Builder Query



Query Builderを使用すると、簡単にデータの取得が行えます。
例えば、get("デーブル名")で指定したテーブルのデータが全件取得できます。


  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->get("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. }





結果が取得出来ました。
登録したデータ、ちゃんとシングルクォートがエスケープされています。

549_07.png




Query Builder Insert



データ取得と同様に、Query Builderを使用して簡単にデータの登録が行えます。
登録したいデータのフィールド名と値のarrayを渡すだけでOK。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         // データベースに接続
  7.         // $this->dbにコネクションが作成される
  8.         $this->load->database();
  9.         
  10.         // 登録用のデータを用意
  11.         $data = array(
  12.             'name' => "四人目",
  13.             'title' => "タイトル",
  14.             'email' => "esc'ape@example.com"
  15.         );
  16.         
  17.         // インサート実行
  18.         $query = $this->db->insert("my_table", $data);
  19.         
  20.     }
  21.     
  22. }




エスケープも自動的に実行されます。これは便利。

549_08.png




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

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

  1. 2015/02/18(水) 21:21:07|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<CodeIgniter 3 データベースの検索結果取得について(Database Reference - Generating Query Results) | ホーム | Debian 7にTomcat 7 + gitbucket + Jenkinsをインストールする>>

コメント

コメントの投稿


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

トラックバック

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