Code Igniter4 & SQLiteでサイトを作って遊ぶ

目次

  1. 背景
  2. 作ったもの
  3. SQLiteとの接続
    1. 接続情報の設定
    2. 権限の確認
  4. Model
  5. Controller
  6. まとめ
  7. 関連記事

背景

こんにちは。 かりんとうマニア(@karintozuki)です。

軽量って響きが好きです。
Code IgniterはPHPの軽量なフレームワークです。
また、SQLiteも名前にLiteと入ってるくらいなので、軽量なDBです。

今回はその二つを使うサイトを作ってみたので、
その際の知見を書いておきます。

作ったもの

ポスッターという心の叫びをポストできる、というサイトを想定しました。
勉強目的に作ったサイトなので、細かいところはあまり突っ込まないで欲しいですが、
フォームに名前と内容を入力して送信すると、
それが一覧に追加される、というシンプルな機能を持っています。

T○itterみたいなのにする予定だったのですが、
どちらかというと5○hみたいになってますね。

GitHubにソースをあげたので、適宜見てみてください。
https://github.com/karintomania/postter

SQLiteとの接続

CodeIgniterから接続するための設定をしていきます。

接続情報の設定

Database.phpの$defaultという変数に接続情報を設定します。
デフォルトのSQLiteのDBファイル配置場所はプロジェクトフォルダ内のwritableファルダです。
writableフォルダ内にdbファイルがある場合、
databaseプロパティはファイル名を指定するだけでOKです。

app/Config/Database.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public $default = [
'DSN' => '',
'hostname' => '',
'username' => '',
'password' => '',
'database' => 'post.db',
'DBDriver' => 'SQLite3',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => '3306',
];

権限の確認

SQLiteは普通のDBと違いユーザなどによる認証がありません。
ですが、dbファイルに書き込むことでデータを保存しているので、
普通のファイルと同じくファイルへの書き込み権限が必要です。

Apacheなどを利用している場合は、実行ユーザが
dbファイルに書き込み権限を持っていることを確認しましょう。

これでめちゃくちゃハマりました。皆様はお気をつけください。

Model

Modelを定義します。

PostModel.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

namespace App\Models;

use CodeIgniter\Model;

class PostModel extends Model
{
protected $table = 'post';
protected $allowedFields = ['post', 'name', 'posted'];

public function getPosts(){
return $this->orderBy('posted', 'desc')
->findAll();
}
}

若干解説をすると、
$tableには言わずもがな、テーブル名を定義します。

$allowedFieldsには、save()メソッドを使う際の更新対象カラムを定義します。
saveメソッドはinsertとupdateをよしなにやってくれるメソッドです。
saveメソッドは自分で実装する必要がありません。

getPosts()メソッドの中では、
$this->findAll();で全件検索ができるので、それを利用しています。
新規ポストを上に持っていきたいので、orderBy()を追加しています。

Controller

特に変わったことはしていません。

Home.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

namespace App\Controllers;

use App\Models\PostModel;

class Home extends BaseController
{
public function index()
{
$model = new PostModel();

$post = $this->request->getVar('post');
if(!empty($post)){
$new_post['post'] = $this->request->getVar('post');
$new_post['name'] = $this->request->getVar('name');
$new_post['posted'] = time();

$model->save($new_post);
}

$data['posts'] = $model->getPosts();

return view('post', $data);
}
}

$model->save($new_post);
ここでsaveメソッドを利用していますね。

まとめ

権限で盛大にハマった以外はサクサクっと開発を進めることができました。

SQLiteは他のDBよりも気楽に使えるので大好きです。
皆様もぜひ何かサービスを作ってみてください。

それじゃ今日はこの辺で。

関連記事

こちらの記事もおすすめです。

VS Codeで複数バージョンのPHPに対してXdebugを利用する