SQLiteを使う(メモ)

 2011年9月9日。ショック。アミーゴデータベースで店のホームページを作っているが、カクテルメニューは良しとしても、ドリンクメニューやフードメニューの場合に著作権表示がうざい。これだ!ライセンス取得にいくらかかるか問い合わせたら、4万円だった。あと一歩で完成だったがあきらめる。4万円払うなら、SQLiteを1からやる。アミーゴにはお世話になったが、さよならの方向しかない。

 今この時点で、SQLiteに対する知識は限りなくゼロに近い。MySQLより使いやすそうだとか、ライセンスの問題は全くないとか、PHP5に付属しているから使わにゃ損とかそんな程度。だいたい、データベース言語そのものを全く知らない。何せ、アミーゴデータベースはそうした知識なしにcgiでデータベースシステムの大枠ができていて、作るというよりはサンプルの改造をするような形でやればわかってなくてもできてしまうというのがその特徴だったし。データベースについては、四半世紀も昔の頃、MSDOSの時代、d-BaseⅢというRDBのはしりみたいなソフトを使ったことがあるが、そんなの忘れたし、今となっては化石みたいなもんだろう。ああ、完成寸前だったのに、また暗中模索が始まる。

 アミーゴを使えるようになるのもある程度苦労したが、やっと使えるようになっておさらばするのも本当につらいが、4万円なんて言われたらどうしようもない。払えない。確かにそれだけの価値のあるものだろうが、ここまでお金をかけずにやってきたポリシーが完全に崩されるのは許されない。cgiはphpと相性が悪い感じしてたので、ここらでお別れするときがやってきたと考えるべきだろう。これまで築き上げたノウハウは仕上げの段階で徒労に終わった。様々な発見や工夫は過去の遺跡となる。先見の明がなかった。こんなことになるなんて。でもポリシーは曲げられない。SQLiteでの新たな出会いに期待をこめて、このメモを書き始める。


PHP5でSQLiteを使用するための設定手順

all aboutに記事があった。
c:windowsのphp.iniを変更 630行目あたりの以下3行
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
のコメントアウトをはずして有効にする。
Apacheを再起動する。
<?
phpinfo();
?>
という内容のファイルをhtdocs内にtest.phpとファイル名をつけて保存。
http://localhost/test.phpをIEで確認。
スクロールすると、以下のようになっている。

PDO
PDO support enabled
PDO drivers sqlite, sqlite2

pdo_sqlite
PDO Driver for SQLite 3.x enabled
PECL Module version 1.0.1 $Id: pdo_sqlite.c 293036 2010-01-03 09:23:27Z sebastian $
SQLite Library 3.3.7undefined

SQLite
PECL Module version 2.0-dev $Id: sqlite.c 298697 2010-04-28 12:10:10Z iliaa $
SQLite Library 2.8.17
SQLite Encoding iso8859

まあ、たぶんOK。

後日談 (9月17日)
PDOでSQLite3のデータベースを扱う場合、「extension=php_pdo_sqlite.dll」を有効にすればよい。前述の
c:windowsのphp.iniを変更 630行目あたりの以下3行
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
;extension=php_sqlite.dll
の最後の行はコメントアウト。これはSQLite2が使えるようにするもの。これが使えると、かえってややこしいじゃないか。
<?
phpinfo();
?>
の実行結果
PDO
PDO support enabled
PDO drivers sqlite

pdo_sqlite
PDO Driver for SQLite 3.x enabled
PECL Module version 1.0.1 $Id: pdo_sqlite.c 293036 2010-01-03 09:23:27Z sebastian $
SQLite Library 3.3.7undefined

ということで、SQLiteの記述はなくなり、PDOでSQLite3を使うことだけができるようになった。

SQLiteManagerを使ってみる

ブラウザでデータベースを操作できるツールを使ってみよう。これも記事があった。
SQLiteManagerのダウンロードよりSQLiteManager-1.2.4.zipをダウンロード。
SQLiteManager-1.2.4.tar.gzとかいうわけのわからんファイルがあるがzipをさがしてそれをDL。
解凍するとSQLiteManager-1.2.4フォルダ内の中にさらにSQLiteManager-1.2.4フォルダがあり、それをApacheのhtdocsフォルダ内にコピー。
IEで
http://localhost/SQLiteManager-1.2.4/index.php


PupSQLiteを使ってみる

SQliteのツールはいろいろあるがPupSQLiteは、Excelファイルのインポートができるという点ですばらしい。早速アミーゴのデータをCSV出力し、それをエクセルファイルにしてPupSQLiteでSQLiteのデータベースに変換した。それこそ1時間もあればできた。これは意外と順調だなあと思っていた。それも束の間。このDBファイルにPHPから接続しようとWEBに転がっているサンプルプログラムを動かしたが、。file is encrypted or is not a databaseというエラー。これはPupSQLiteがSQLite3のDBを作るから。今パソコンにインストールされているPHPは5.2で、これはSQLite2に対応している。SQLite3のDBファイルはPHP5.3で読むべき。PDOを使う手もある。あるいはSQLite3のDBファイルをSQLite2のDBファイルに変換するという方法もある。
SQLite2とSQLite3をダウンロードし、Zipを解凍。中に入っているのはそれぞれsqlite.exeとsqlite3.exeで、c:に置く。インストールは置くだけ。c:に変換したいSQLite3のDBファイルtest3.dbを置く。コマンドプロンプトでcd c:\ としたあと、
sqlite3 C:\test3.db .dump | sqlite.exe C:\test2.db
とすれば、SQLite2形式のDBであるtest2.dbが出来上がる。簡単だったがなぜかサイズが倍に。しかも、PHPのサンプルで読み込んだテーブルは恐ろしく文字化けしていた。
もう、こうなったら、PHP5.3でやるしかないでしょ。


PHP5.3をインストール

なんではじめからPHP5.3にしなかったのか。5.2の方が安定してると思ったのか。ともかくサーバー1台と作業用のパソコン2台のPHP5.2を5.3にする。
http://www.php.net/downloads.php
より最新版のPHPをダウンロード。最新版PHPの「 WindowsBinaries 」にある
http://windows.php.net/download/
と書いてあるリンクをクリック。
サーバにApacheを利用する場合はVC6にしろって書いてある。ははあ。だからか。
そんなことは無視だ。ともかくやってみなけりゃわからん。
PHP 5.3 (5.3.8)
VC9 x86 Thread Safe (2011-Aug-23 12:01:10)
■Zip [15.06MB]
をダウンロード。

Cドライブ内のPHP5.2が入れてあるphpフォルダを削除し、(これ、APACEをEXITで終わるだけでは使用中で、削除できない。コントロールパネル→パフォーマンスとメンテ→管理ツールのサービスで停止すること。)新たにダウンロードしたZIPファイルを解凍してできたフォルダをphpという名前でc:に置く。

ディレクトリ内にある「 php5ts.dll 」ファイルをC:\WINDOWSディレクトリ内のsystem32ディレクトリにコピー。
次に、「 php.ini-development 」ファイルをWINDOWSディレクトリにコピーした上でphp.ini-developmentファイルの名前を「 php.ini 」に変更。
httpd.conf の設定 次にPHPの設定を行う。
c:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
をメモ帳やエディタで開く。
LoadModuleの項に次の行を追加。これでApache2にPHPモジュールを適用。
(Apache2.2.*をインストールしたためphp5apache2_2.dllを使う。)
LoadModule php5_module c:/php/php5apache2_2.dll
cmd=upload&act=open&pageid=62&file=12.gif,blank)
AddTypeの項の最後に次の行を追加し、Apache2にphpのファイル形式を定義。
AddType application/x-httpd-php .php
cmd=upload&act=open&pageid=62&file=13.gif,blank)
php.ini の設定
次に、c:\WINDOWSディレクトリ内にあるphp.iniをメモ帳などで開き
doc_root = を次のように追加して修正。
doc_root = "c:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
さらに、次の行を変更。
「"./"」を「"c:/php/ext"」に変更。
(変更前)
extension_dir = "./"
(変更後)
extension_dir = "c:/php/ext"
環境変数の追加  PHPをインストールしたディレクトリを環境変数に追加。
[WindowsXPの場合]
「マイコンピュータ」を右クリックし「プロパティ」をクリック、「詳細設定」タブから「環境変数」をクリック。
環境変数ダイアログが表示。
下段にある「システム環境変数」一覧から、変数名「Path」を選択し「編集」をクリック。システム変数の編集ダイアログが表示される。
「変数値」には既に値が入力されている。既にある入力値は消さないように注意。変数値の最後にPHPをインストールしたディレクトリを追加。環境変数はセミコロン「;」で区切られので、変数値の最後にセミコロンがない場合は「;c:\php」を最後に追加。

Apacheの再起動
これらの設定が終わったらApache2を再起動して設定を有効にする(httpd.confやphp.iniなどの初期設定を変更した場合はApacheの再起動を行なう)。 
タスクトレイにある「Apache Services」を右クリックして、「Open Apache Monitor」を選択。
Apache Service Monitorが起動。 Restartをクリックして再起動。
PHPの動作確認
設定が終了したらPHPの動作確認をする。エディタなどに以下のスクリプトを入力。
<?php
phpinfo();
?>
ファイルを
C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\info.php
内に保存。ファイル名をinfo.phpなどと拡張子を.phpにする。そしてブラウザから http://localhost/info.php にアクセスしてversion情報がちゃんと表示されるか確認。


Mbstringを有効に
http://www.aconus.com/~oyaji/www/apache_win_php.htm
■PHPの設定
PHPの設定は、C:\PHP\php.ini-developmentを C:\WINNT配下にコピーし、「php.ini」というファイル名に変更してこの内容を修正。
PHPの設定は結構厄介で、設定を誤ると文字化けに悩まされることになる。いろいろなサイトにphp.iniも設定例が載っているが、結論は以下のとおりです。
•一般的にPHPの記述コードとHTTP出力のコードは一致しているため、透過・無変換を基本とする。
→ この設定なら、例えば、phpMyAdminはUTF-8で自作PHPはEUC-JPといった具合に、システムに複数のコード系が混在しても文字化けすることは無い。
•上記の条件に合わないアプリ(PHPの記述コードが EUC-JPでHTTP出力のコードがShift_JIS等)は、当該アプリだけ「.htaccess」で個別の変換を行うとよい。
→ SmartyなどはEUC-JPが前提のためHTTP出力をShift_JISにしたりすると文字化け問題が発生するが、それはソフトのコーディーングの問題なので、個別に対処すべき。
設定変更したところ。
output_buffering = Off
;output_handler =
default_charset = ""
extension_dir = "c:/php/ext"
extension=php_mbstring.dll
session.save_path = c:/temp
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = EUC-JP,SJIS,JIS,UTF-8,ASCII
mbstring.substitute_character = none;
php.iniの設定の概要は、以下。
a.output_buffering = Off :一般的に出力バッファリング制御をチャント実行しているとは思えないので、ここはOffを指定。
b.;output_handler = :出力の変換をする場合は変換を有効にするためにmb_output_handlerを指定するが、無変換なので無効のままとする。
c.default_charset = "" : PHPがContent-type:ヘッダでcharacter encodingを出力するコードを指定するが、コードはソフトに依存するのでcharsetの送信を無効(空)にし透過させる。
d.extension_dir = "c:/php/ext"へのパスを指定
e.extension=php_mbstring.dll:extension は全てコメントアウトされているので、必要に応じてアンコメントアウト(行頭の「 ; 」を削除)する。
f.session.save_path = c:/temp :セッションのデータが保存されるディレクトリ。デフォルトはインストールパーティションの/tempなので、C:\tempになるが、Cには通常はないので、tempディレクトリを作成する。フラグメントを避けるためスワップとtempファイルはそれぞれ別の専用パーティションにしてあるので、そこを指定。
g.mbstring.language = Japanese : mbstringで使用される言語のデフォルト値
h.mbstring.internal_encoding = EUC-JP : 内部文字エンコーディングのデフォルト値
i.mbstring.http_input = pass : HTTP入力文字エンコーディングを指定するが、透過なので「pass」とする。
j.mbstring.http_output = pass : HTTP出力文字エンコーディングを指定するが、透過なので「pass」とする。
k.mbstring.encoding_translation = Off : HTTP入力文字エンコーディング検出および内部文字エンコーディングへの変換用であるが、無変換なので「Off」とする。
l.mbstring.detect_order = EUC-JP,SJIS,JIS,UTF-8,ASCII : 文字コードの検出順序でありデフォルトはauto。但し、autoの検出順序がASCII, JIS, UTF-8, EUC-JP, SJISのため誤検出するようなので、順序を入れ替え指定。
m.mbstring.substitute_character = none; : 無効な文字を代替する文字
なお、PHPはEUC-JPで記述されているが、HTTP出力では Shift_JISで出力されるような場合は、そのアプリだけ .htaccess で指定してあげればよい。PHPがEUC-JPで出力がShift_JISの場合の.htaccessの記述例を下記に示します。 なお、. htaccessで記述する場合は、下記が参考になる。
http://www.shigeweb.jp/php/project_p/?section=setup&page=htaccess

c:windowsのphp.iniの変更つづき(SQLite関係)

970行目~980行目あたりの以下3行

extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
extension=php_sqlite3.dll

のコメントアウトをはずして有効にする。
Apacheを再起動する。

<?php
phpinfo();
?>

という内容のファイルをhtdocs内にtest.phpとファイル名をつけて保存。
http://localhost/test.phpをIEで確認。
スクロールすると、以下のようになっている。

pdo_sqlite
PDO Driver for SQLite 3.x enabled
SQLite Library 3.7.7.1

SQLite
SQLite support enabled
PECL Module version 2.0-dev $Id: sqlite.c 306939 2011-01-01 02:19:59Z felipe $
SQLite Library 2.8.17
SQLite Encoding iso8859

Directive Local Value Master Value
sqlite.assoc_case 0 0

sqlite3
SQLite3 support enabled
SQLite3 module version 0.7-dev
SQLite Library 3.7.7.1

Directive Local Value Master Value
sqlite3.extension_dir no value no value

この、sqlite3.extension_dirってのが何なんです?
まあ、ともかく、駄目ですよって言われてたAPACHEとPHP5.3の組み合わせで
特に問題なくインストールできた。

しかし、不気味だね。本家がPHP5.3とAPACHEの組み合わせはエラーが出ますよって言っているのにそれを無視してやるってのはどうもね。爆弾抱えてるみたいでね。

そうこうしているうちに本が配達された。昨日の夜というか今日の朝というか午前1時ごろ注文したやつ。19時間ぐらいで配達されてきた。amazonのお急ぎ便。無料お試しだったので。有料ならやらない。そんなに急ぐことでもない。
西沢直木著 SQLite入門 第2版 翔泳社 2940円
高いけどネット見てもちりじりばらばらなことが書かれていてわからんし。しょうがない。アミーゴに4万円払うことを思えば安いもんだ。
ちょっと腰をすえて、本読んで勉強しないとだめだ。

しかし、肝心のこの本PHPは5.2の環境。SQLiteは基本2だ。3を使うのはPDOでやるという立場。現時点では確かにそうなるだろう。
SQLiteのSの字もわかっていないやつがえらそうなことを言うが、SQLiteのバージョンアップはややこしいことになっている。APACHEとの絡みからか、現時点でSQLite3が主流となりつつあるのに、PHPではSQLite2を基本としており、PDOでしかSQLite3に対応できないという形。もう少し本を読んでからPHPを5.3にすべきだったかも。しかし、インストールは正常にできたので、ローカルのパソコン1台はこのままPHP5.3でいこう。サーバーともう1台はPHP5.2のままでしばらく様子を見る。そのうちPHPの本家もAPACHEに対応するPHP5.4とか5.5とか出してくれるでしょ。ただで利用している人間が何も言う資格ないけどね。それを言っちゃーおしまいでしょう。だははははー。このページはこれくらいにしておこう。

後日談(9月17日)
やはり、APACHEにPHP5.3はよくないようで、日付の表示で警告が出る。そのほかにもよくわからないことが頻発した。というわけで、現在はPHP5.2に戻している。もちろんSQLiteは3を使うので、PDO関数を使う。SQLite関数を使えるようにしても、それはSQLite2なので良くない。混乱を避けるため、使えなくしたほうが良い。
最終更新:2011年09月22日 15:27