CakePHP2.0系でSQLite2を使うには


【追記】
CakePHP2.0系は、もともとの仕様としてSQLite3のみをサポートしています。
SQLite2を使おうとするのは、つまり邪道です。
http://book.cakephp.org/2.0/ja/appendices/2-0-migration-guide.html#id30


Sqliteサポートが素晴らしく向上しました。
cake 1.3との主な違いはSqlite 3.xのみをサポートするということです。』


問題点

CakePHPでおなじみのブログチュートリアルを試していて、MySQLになら接続できるのに、SQLite2には接続できない問題に直面しました。
下記のメッセージが表示されてしまいます。
『Error: SQLSTATE[HY000]: General error: 26 file is encrypted or is not a database』


詳しくはフォーラムで質問していますので、そちらをご覧ください。
【参考】"(Cake2.0.3) SQLiteからデータを読み出せない" フォーラム - CakePHP Users in Japan
http://bit.ly/AEXYVj


解決方法

下記のように、緑色文字部分を追加。

【(Cakeフォルダ)/lib/Cake/Model/Datasource/Database/Sqlite.php
(113行目〜)
//$this->_connection = new PDO('sqlite:' . $config['database'], null, null, $flags);
$this->_connection = new PDO('sqlite2:' . $config['database'], null, null, $flags);


なぜそうするのか(理由)

PDOで、SQLite2とSQLite3ではDSN(データソース名:Data Source Name)の記述が異なります。


【そもそものPDOのコンストラクタの書き方】

$pdo = new PDO('DSN', 'ユーザ名', 'パスワード', 'ドライバオプション');
【参考】PHP: PDO::__construct - Manual
http://php.net/manual/ja/pdo.construct.php


SQLiteのDSNの書き方】
バージョンDSN
SQLite2sqlite2:/path/to/pdotest.sq2
SQLite3sqlite:/path/to/pdotest.sq3
【参考】PDOでサクサクDB開発(2/9):CodeZine
http://codezine.jp/article/detail/433?p=2


つまり、CakePHP2.0はSQLite3用の記述になってたわけです。
なので、SQLite2用の記述に変更すれば解決できます。


残った疑問

Windows VistaではSQLite3に正常に接続することができます。
しかし、Ubuntuでは失敗します。


普段はUbuntu機をメインに使っているので、『CakePHP2.0では、SQLite2も3も使えない!』と思い込んでいました。
今後は、SQLite2ならばWindowsでもUbuntuでもデータを読み出せるので、ローカルでのテスト用にSQLiteを使っている私としては、これで問題ありません。
Ubuntu(おそらくLinux全般)でSQLite3をどうしても使いたい!という方は…、頑張って解決策を見つけてください(^ ^;)

【追記】
UbuntuでSQLite3が使えないのは、私のPCだけの不具合なのかもしれません。
現在のところ、理由ははっきりしません。