CodeIgniter3.xのユーザガイドにあるチュートリアルをSQLite3を使って試してみたのだが、設定ミスとエラーでDBが読み込まれず、解決まで思わぬ時間を使ってしまった。
同じ問題に突き当たった人のために解決方法をここに書き残しておく。
前提
開発環境
OS: Windows7 SP1
サーバ: Apache/2.4.23
PHPバージョン: 7.0.15
CodeIgniterバージョン: 3.1.0
サーバ、PHPなどの環境は、BitNamiで構築したWordpressと一緒に入っているものを使用した。
DBファイルの配置
・DBファイルはtest_db.sqlite3という名前で既に用意してあるものとする。
・下記ツリーの通り、applicationディレクトリの下にsqlite3というディレクトリを作成し、そこにDBファイルを置く。
CodeIgniter-3.x
└ application
└ sqlite3
└ test_db.sqlite3
私の失敗その1 database.phpの設定
インストール直後はMySQLの設定がされており、ユーザガイドのデータベースリファレンスにもMySQLの例しか載っていない。
また、サーバ要件の記載でSQLiteの項には
・SQLite、 sqlite(バージョン 2)、 *sqlite3(バージョン 3)そして *pdo ドライバを利用
と書いてあり、「そして *pdo ドライバを利用」?pdoを使って設定したほうがいいのか?と思ってしまったりして不慣れな私は迷った。
当然のごとくググってみるとsqlite3を設定する方法とpdoで設定する方法のどちらも出てくるのでさらに迷った。
失敗その1を解決
結局のところ、下記のように設定すれば成功した。ここまで辿り着くことは出来ていたのだが次の項目に書いた「失敗その2」によって間違っているかもしれないと勘違いし、別の方法を試したりして無駄な時間を過ごしてしまった。同様に迷っている人はさっさとこれを丸パクリしてしまえばいい。
「’database’」のところの「APPPATH」というのは、applicationディレクトリまでのパスを現す定数である。
$active_group = 'default';
$query_builder = TRUE;
$db['default'] = array(
'dsn' => '',
'hostname' => '',
'username' => '',
'password' => '',
'database' => APPPATH.'sqlite3/test_db.sqlite3',
'dbdriver' => 'sqlite3',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
私の失敗その2 sqlite3拡張モジュールの有効化
database.phpの設定で「’dbdriver’」のところを‘sqlite3’と設定したら下記のようなエラーが起きた。
An uncaught Exception was encountered
Type: Error
Message: Class 'SQLite3' not found
Filename: C:\Bitnami\wordpress-4.7.2-0\apache2\htdocs\ci\system\database\drivers\sqlite3\sqlite3_driver.php
Line Number: 89
Backtrace:
File: C:\Bitnami\wordpress-4.7.2-0\apache2\htdocs\ci\application\models\News_model.php
Line: 6
Function: database
File: C:\Bitnami\wordpress-4.7.2-0\apache2\htdocs\ci\application\controllers\News.php
Line: 7
Function: model
File: C:\Bitnami\wordpress-4.7.2-0\apache2\htdocs\ci\index.php
Line: 315
Function: require_once
開発環境は違うが下記のサイトに同様の事例が載っている。
このエラーは設定が間違っていたわけではなく、PHPのsqlite3拡張モジュールが有効でなかった場合に起きるようだ。
CodeIgniter 3でSQLite3を使用する(Debian 7 + php-fpm)
(リンク先:Symfoware – Symfowareについての考察blog)
失敗その2を解決
php.iniの編集
Windowsでこのエラーが出る場合、PHPをインストールしているディレクトリにある設定ファイルphp.iniにてsqlite3拡張モジュールを有効化する変更が必要。
この状態ではphpinfo()を実行してもsqlite3の項目が出てこないはずである。
同じくPHPをインストールしているディレクトリにあるextディレクトリを確認してみるとphp_sqlite3.dllというDLLが存在することがわかる。
この名前をphp.iniの中から探すと下記のように先頭にセミコロンが付いている行が見つかる。
;extension=php_sqlite3.dll
このセミコロンを除去し、下記のような状態にする。
extension=php_sqlite3.dll
これが出来たらphp.iniを保存する。
Apacheのリスタート
これをやらなければphp.iniを編集しても反映されないのでいつまでたってもエラーは消えない。
やり方はいろいろあると思うがBitnamiなら下の画像のようなツールが付属しているので、Restartボタンを押すだけだ。

私の場合、php.iniを編集したらApacheをリスタートしなければ反映されないことを知らなかったためここでさらに時間を使ってしまった……。
そして成功
ここまでの操作でphpinfo()を実行した場合には下記画像のようなsqlite3の項目が表示されるようになっているはず。

そして無事にチュートリアルの通り作成出来たニュース表示サイトの画面がこちら。

ググってもつまずいている人がそんなにいないようだったがPHPの開発に慣れている人達はこんなの余裕なのだろうか。
自分は不慣れだったのでここまでがけっこう苦労した。
一応、CodeIgniter3とSQLite3が使えるようになったので、まずは何か小さいWebアプリから挑戦してみたいところ。