はじめての CodeIgniter でデータベースを使った Web アプリを作成するまでの勉強メモ

普段は CakePHP を使っていますが、CodeIgniter を入門しました。CodeIgniter を使ってデータベースを使った Web アプリを作成する過程で取った勉強メモがありますのでブログに公開しておきます。

CodeIgniter をダウンロードする

公式サイトからダウンロードができます。ダウンロードしたファイルを展開するだけで完了です。ブラウザからアクセスするとページが表示されます。かなり整理されたユーザガイドがありますのでひと通り読んでおきます。詳細まで学びたい場合はこちらを読みます。

初期設定

設定ファイルはセキュリティ向上のため公開ディレクトリ外に置くことも可能です。デフォルトでは .htaccess でアクセスできないようになっていますが、.htaccess に対応していない環境などでは別途対応するための作業が必要です。

ご自分が作りたいサイトによって書き換えるファイルが変わってくるかと思います。今回は参考のために私が行ったファイルへの変更のメモをのせておきます。

application/config/config.php

.htaccess のサンプルは以下です。

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

application/config/database.php

  • データベースの接続情報を設定。

application/config/routes.php

  • $route['default_controller'] でデフォルトコントローラーを設定。

CodeIgniter のコントローラーを使う

CodeIgniter はコントローラーだけで動作可能。そして以下のように CakePHP と似たような感じで動作します。URL を見ると CakePHP みたいに作れそうな気がしてきます。

example.com/class/function

パラメータは URL から以下のように受け取ることができます。

example.com/pages/test/100

そしてコントローラーではこのように設定します。CakePHP と似ているので抵抗を感じません。

1
2
3
4
5
6
7
class Pages extends CI_Controller
{
    public function test($id)
    {
        echo $id;
    }
}

CakePHP でもできるかは分かりませんが、CodeIgniter ではサブフォルダにコントローラーを置くことができます。サブフォルダにコントローラーを置いた場合は以下のようにアクセスできます。

example.com/subfolder/class/function

CodeIgniter のビューを使う

ビューを使う場合は以下のようにビューファイルを設定するだけ。これで application/views/index.php が読み込まれます。デフォルトのビューなどは無いので必要なら自分で作ることができます。

1
2
3
4
5
6
7
class Pages extends CI_Controller
{
	public function index()
	{
		$this->load->view('index');
	}
}

サブフォルダにビューを置いて読み込むこともできます。

1
$this->load->view('folder_name/file_name');

ビューに値を渡す場合は以下のようにします。

1
2
3
4
5
6
7
8
9
class Pages extends CI_Controller
{
	public function index()
	{
		$data['title'] = "My Real Title";
		$data['heading'] = "My Real Heading";
		$this->load->view('index', $data);
	}
}

ビューでは以下のように出力します。

1
2
3
4
5
6
7
8
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
	<h1><?php echo $heading;?></h1>
</body>
</html>

キーが変数名になっています。CakePHP では変数名は毎度宣言する形式なのでここが違います。変数には配列なども普通に使えます。

ビューをデータとして受け取る場合は以下のようにします。

1
$string = $this->load->view('myfile', '', true);

CodeIgniter でモデルを使う

以下がモデルの例です。application/models/model_name.php として保存します。モデルもビューやコントローラー同様サブフォルダに配置することができ、読み込みの際もビューのように読み込むことができます。

1
2
3
4
5
6
7
class Model_name extends CI_Model
{
    function __construct()
    {
        parent::__construct();
    }
}

実際に読み込んで使う場合は以下のようにします。

1
2
$this->load->model('Model_name');
$this->Model_name->function();

データベースには自動的に接続しません。そのため使う場合は以下のように手動で接続します。もちろん自動的に接続するように設定することも可能ですがこの記事では割愛します。

1
$this->load->database();

データベースに接続後以下のようにしてテーブルにデータを追加します。

1
2
3
$sql = "INSERT INTO test (id, name, test)
        VALUES (" . $this->db->escape(1) . ", " . $this->db->escape('test name') . ", " . $this->db->escape('test name2') . ")";
$this->db->query($sql);

データを取り出す時は以下のような感じです。

1
2
3
4
5
6
7
8
$query = $this->db->query('SELECT id, name FROM test WHERE id = 1');
if($query->num_rows() > 0) {
    foreach ($query->result() as $row)
    {
        echo $row->id;
        echo $row->name;
    }
}

応用して試しにテーブルにデータが存在しなければデータを書きこむサンプルを書いてみると以下のような感じです。

1
2
3
4
5
6
$this->db->query('SELECT id FROM test WHERE name = ' . $this->db->escape($test) . ' LIMIT 1');
if($this->db->affected_rows() < 1) {
    if( ! $this->db->query('INSERT INTO test (name) VALUES (' . $this->db->escape($test) . ')')) {
        echo 'データの書き込みに失敗しました。';
    }
}

SQL を直接書かなくても CakePHP のように簡単にデータベースを操作することもできます。CodeIgniter は Active Record データベースパターンの改変版を採用しているそうなので、これを使えばかなり少ない記述でデータを扱えます。詳しくは以下のページにあります。

直接 SQL を書いたほうが速度は速くなります。以下のページでベンチマークを取っています。

Active Record はデフォルトでは有効になっています。使わない場合は /apptication/config/database.php の以下の行を false に変更します。

42
$active_record = false;

また、クエリのバインディングというのがあり SQL を書くのに大変便利です。CodeIgniter でデータベースを使ったシンプルなキャッシュを実装するサンプルコードという記事でそちらについて触れていますので、参考にしてください。

CodeIgniter でヘルパーを使う

コントローラーで以下のように読み込みます。

1
$this->load->helper(Array('weble', 'url'));

ヘルパーのファイル名は weble_helper.php のようにして application/helpers 以下に保存します。ファイルの内容は以下のような感じで関数を入れていきます。

1
2
3
4
5
6
7
8
function title($title)
{
    return config_item('site_name');
}
function test()
{
    return 'test';
}

コントローラーやビューなど至る所で自由にヘルパーを使うことができます。

CodeIgniter でページネーションを使う

データベースに入ってる情報を一覧にするのにページネーションは必須です。そんなページネーションのライブラリが最初からあるので使ってみました。ちなみに CakePHP などではデータの取り出しまで自動でやってくれますが、CodeIgniter は表示までだけなので取り出しなどの実装は自分で行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 初期設定
$limit = 20;
 
// データの取得
$items = $this->Data->get('1=1', $limit, $paged);
 
// ページネーションの設定
$this->pagination->initialize(
    Array(
        'base_url' => '/find/all',
        'total_rows' => $this->Data->count('1=1'),
        'per_page' => $limit,
        'num_links' => 9,
        'first_link' => false,
        'last_link' => false,
        'prev_link' => '前へ',
        'next_link' => '次へ'
    )
); 
$data = Array(
    'items' => $items,
    'paginate' => $this->pagination->create_links()
);
$this->load->view('list', $data);

実際に動かしているコードから必要な部分を取り出しました。

CodeIgniter のルーティング

ページネーションなどで URL にセグメントを使う場合は以下のようにして値を割り当てます。以下は数値が来たら $1 にそれを割り当てる設定です。

1
$route['datas/(:num)'] = "datas/index/$1";

CodeIgniter を触ってみて

CodeIgniter は以前から気になっていたので今回触ることが出来て面白かったです。ユーザーガイドがとてもしっかりしていて、誰でも分かるように書かれていますので大変参考になりました。

CakePHP と CodeIgniter それぞれどちらが良いというのはありませんが、CodeIgniter は CakePHP に比べてより自由なフレームワークだと感じました。CakePHP と CodeIgniter、それぞれを使い分けてサイト構築をしていければ良いと感じました。

また新しく勉強したことや気付きがあればこの記事に追記させて頂きます。

コメント

  1. 匿名さんのコメント

    ルーティングの箇所の
    >> $route['datas'] = “datas/index”;
    というのは不要じゃないでしょうか。

    マニュアルには
    “index”メソッドは、デフォルトでは、第2セグメントが空のときに常に呼ばれるメソッドになります。”
    とあります。