Jeans & Development / Nucleus/SQLite https://www.rad51.net/jeans/ コンピューターのことなどを綴ったメモ (旧:目から鱗 w/SQLite) / Nucleus用SQLite/MySQLラッパーについて ja Jeans CMS © Weblog http://backend.userland.com/rss https://www.rad51.net/jeans/skins/jeans/images/jeans2.gif Jeans & Development https://www.rad51.net/jeans/ Jeans CMS 0.7.0 alphaを公開 https://www.rad51.net/jeans/?itemid=780
http://jeanscms.sourceforge.jp/index.php?itemid=25

それに伴い、ここのサイトもいずれJeans CMSに移行します。そうなるとおそらく、Nucleus-SQLiteのサポートはできなくなると思います。もし、Nucleus-SQLiteのメンテナンスをしていただけるとお考えの方がいらっしゃいましたら、お知らせください。引継ぎ(といっても、たいしたことはありませんが)をさせていただきます。]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=780 Tue, 02 Mar 2010 13:38:13 PST ITEM780_20100302
SQLiteラッパ ver 0.9.0.3 https://www.rad51.net/jeans/?itemid=615
修正版を 0.9.0.3 として、Nucleusフォーラムにアップしました。該当する方は、アップグレードしてください。バグ修正だけなので、前のバージョンのまま使っていても、セキュリティー上の問題はありません。]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=615 Fri, 22 Feb 2008 18:14:24 PST ITEM615_20080222
PHPにsqlite_free_resultが無い訳 https://www.rad51.net/jeans/?itemid=556
PHP4のZendエンジンに導入されたリファレンスカウンティングシステムのおかげで、あるリソースがもう参照されなくなった場合に(Javaと全く 同様に)、そのリソースは自動的に削除されます。この場合、このリソー スが作成した全てのリソースはガーベッジコレクタにより開放されます。 このため、free_result関数を用いて手動でメモリを開放する必要が生じるのはまれです。

注意: 持続的データベース接続は特別で、ガーベッジコレクタにより破棄されません。


ガベージコレクタが自動的にやってくれるということらしい。持続的接続の場合にどうするかということだが、そういう場合はfree_resultが必要な処理は行うなということかもしれない。どちらにせよ、私は持続的接続は使わないだろうから、この機能があっても無くてもいいんだけれど。]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=556 Mon, 07 Jan 2008 13:04:30 PST ITEM556_20080107
SQLite Manager で、新規データベースを登録するとき https://www.rad51.net/jeans/?itemid=526
また、sqlite_open() 関数でできた、長さゼロのデータベースファイルを登録しようとしても、うまく行かない。こうった場合は、一度データベースファイルを削除し、SQLite Manager に空のデータベースファイルを作成させるようにする。

以前同じ問題を解決していたにもかかわらず忘れていたので、ここにメモ。もしかしたら、新しいバージョンのSQLite Managerでは解決されているのかもしれないけれど…。
登録の例

]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=526 Sun, 23 Dec 2007 13:45:51 PST ITEM526_20071223
SQLiteの、便利だけれど危険な機能 https://www.rad51.net/jeans/?itemid=524
PHP は、データベースが最初にオープンされる際に phpという名前の特別な関数を登録します。 このphp関数は、事前に登録することなしにあらゆるPHP関数をコールする ために使用可能です。

例 2. PHP関数の使用例

<?php
$rows = sqlite_array_query($db, "SELECT php('md5', filename) from files");
?>


この機能、とても便利だけれど、諸刃の剣である。あらゆるPHP関数をコールすることが出来るのは、プログラマーにとって有益だけれど、同時にクラッカーにとっても有益であるということ。すなわち、SQLiteでSQLインジェクションが起きてしまった場合、それは即、PHPのあらゆる関数を呼び出すことが出来るということになる。例えば、file_get_contentsを使えば、サーバー上のファイルの内容を呼び出せるし、file_put_contentsを使えば、任意のファイルをサーバー上に構築したり出来てしまう。

幸いに、sqlite_create_functionを用いてオーバーライドすることが可能なので、この機能を無効化したり、呼び出す関数に制限を加えたりすることは簡単に出来る。例えば、

sqlite_create_function($db,'php','pi');

とすれば、クエリー中でphp関数を用いても、円周率の値を返すだけになる。

次期バージョンのSQLiteラッパーで対応します]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=524 Fri, 21 Dec 2007 13:04:54 PST ITEM524_20071221
SQLiteスピードアップ:PRAGMA default_synchronous = OFF https://www.rad51.net/jeans/?itemid=266
クエリーとして、

PRAGMA default_synchronous = OFF;

を実行すればよい。Nucleus-SQLiteの場合は、NP_SQLiteの管理画面から実行できる。default_synchronous の設定には3つ、『OFF』『NORMAL』『FULL』とあって、データ書き込みの際のOSとのシンクロを制御しているらしい(デフォルトは『NORMAL』)。『FULL』なら、OSがクラッシュしたようなときでもデータベースが壊れない。その代わり、速度が犠牲になる。『OFF』の場合は、速度は向上するけれど、データのハードディスクへの書き込みの際にOSがクラッシュすると、データベースが壊れる可能性がゼロで無くなる。

Windowsで利用するときに、『OFF』にすると速度の大幅な向上が見られた。こまめにデータベースをバックアップするようにすればこれでも良いだろう。一方、このラクーカンのサーバでは、『OFF』でも『NORMAL』でも速度の差がなかったので、『NORMAL』(デフォルト)にしておいた。]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=266 Tue, 27 Mar 2007 14:28:25 PDT ITEM266_20070327
SQLite Manager https://www.rad51.net/jeans/?itemid=239  Nucleus-SQLite の管理のため、SQLite Manager を導入した。phpMyAdmin 同様、セキュリティーには要注意である。次の方法で、セキュリティーを確保することにした。

1)インストールするURLを、第三者が知り得ないものにする。

2).htaccess を用いて、アクセスできる IP アドレスを絞込み、自分が使っているコンピュータ以外からのアクセスを出来るだけ阻止する。

3).htaccess を用いて、パスワードの設定を行う。

4)使用している Nucleus に super-admin としてログインしているときのみ SQLite Manager が使用できるようにする。

4)のための設定として、include/user_defined.inc.php に次の記述を書き加えた。

$DIR_NUCLEUS = '/xxxxxxxx/xxxxxxxx/nucleus/';
include($DIR_NUCLEUS.'sqlite/sqlite.php');
$res=nucleus_mysql_query('SELECT value FROM nucleus_config WHERE name="CookiePrefix"');
if ($row=nucleus_mysql_fetch_row($res)) $cp=$row[0]; else $cp='';
$user=$_COOKIE[$cp.'user'];
$key=$_COOKIE[$cp.'loginkey'];
if (!$user || !$key) exit('You are not logged in.');
$res=nucleus_mysql_query('SELECT mcookiekey, madmin FROM nucleus_member WHERE mname="'.addslashes($user).'"');
if ($row=nucleus_mysql_fetch_row($res)) $mkey=$row[0]; else $mkey='';
if ($key!=$mkey) exit('You are not logged in.');
if ($row[1]!=1) exit('You are not super-admin.');

これで、Nucleus にログインしているときのみ、SQLite Manager が使えるようになる。

(追記:07-06-26)
Nucleus 3.3 では、以下のように記述する必要がある(下から2行目が書き換わっている)。
$DIR_NUCLEUS = '/xxxxxxxx/xxxxxxxx/nucleus/';
include($DIR_NUCLEUS.'sqlite/sqlite.php');
$res=nucleus_mysql_query('SELECT value FROM nucleus_config WHERE name="CookiePrefix"');
if ($row=nucleus_mysql_fetch_row($res)) $cp=$row[0]; else $cp='';
$user=$_COOKIE[$cp.'user'];
$key=$_COOKIE[$cp.'loginkey'];
if (!$user || !$key) exit('You are not logged in.');
$res=nucleus_mysql_query('SELECT mcookiekey, madmin FROM nucleus_member WHERE mname="'.addslashes($user).'"');
if ($row=nucleus_mysql_fetch_row($res)) $mkey=$row[0]; else $mkey='';
if (md5($key.preg_replace('/\.[0-9]+$/','',$_SERVER['REMOTE_ADDR']))!=$mkey) exit('You are not logged in.');
if ($row[1]!=1) exit('You are not super-admin.');
]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=239 Sun, 26 Nov 2006 16:38:29 PST ITEM239_20061126
Windows に Nucleus-SQLite をインストールする https://www.rad51.net/jeans/?itemid=228  先日、自宅の Windows に Nucleus-SQLite を導入した。サーバ環境の構築から始めたが、Apache, PHP, SQLite のインストールでかなり手間取った。忘れないうちに、メモ。
 SQLiteでなくMySQLを利用する場合はXAMPPやphpdevなど、簡単にサーバ構築できるソフトがあるが、SQLiteの場合は一つ一つ構築するのが基本であろう。

1.Apacheのインストール

 まずは、WebサーバとしてApacheを導入した。ここで使うApacheは、Apache-2.0.xである(2.2.xを使用せずに2.0.xを使うというのがインストールを成功させるための最初の関門)。http://httpd.apache.org/download.cgiからWin32用のバイナリがダウンロードできる(2006-11-10現在、ver 2.0.59)。『apache_2.0.xx-win32-x86-no_ssl.msi』というファイルがそれである。これをダウンロードし、インストールする。ほとんどの設定はデフォルトのままでOK。ここでは、インストールするディレクトリに、『C:\Program Files\Apache2.0\』を選択した。
 インストールが終了すると、右下のタスクバーにApache OKが表示されているはずで、もしそうであればすでにApacheが起動している。『http://localhost/』にアクセスすると、『あなたの予想に反して、このページが見えているでしょうか?』というメッセージとともに、次のようなApacheのバナーを見ることが出来るであろう。

Apache

 もし右下のタスクバーのアイコンがApache NGになっている場合はApacheがまだ起動していないので、このアイコンをクリックして現れたダイアログで『Start』ボタンを押すと起動する(それでも起動されない場合は、インストールがうまくいっていない可能性が高い)。

2.PHPのインストール

 続けて、PHPを入手してインストールした。ダウンロードは、http://www.php.net/downloads.phpから行うことが出来る。ここでは、PHP 4.4.x の系列を入手した(2006-11-10時点での最新バージョンは、4.4.4)。『PHP 4.4.x zip package』 を選択すると、『php-4.4.x-Win32.zip』がダウンロードできる。ダウンロード後に解凍し、現れたファイルを適当な場所におく。ここでは、『C:\Program Files\php\』を選択し、このフォルダの中にファイルを移動させた。
 なお、解凍して出来たファイルのうち、『php4ts.dll』だけはSystem32ディレクトリ(Windows XPの場合は『C:\Windows\systen32\』、Windows 2000の場合は『C:\WINNT\systen32\』 )に移動しておく。

3.ApacheとPHPの連携

 まだPHPについてはファイルを解凍して適当なフォルダに配置しただけなので、Apacheからそれを呼び出す様にはなっていない。これを行うには、『httpd.conf』という名のファイル( 『C:\Program Files\Apache2.0\Apache\conf\』にある)を編集する必要がある。ここでは、次のように設定した。

『httpd.conf』の内容(抜粋):
LoadModule php4_module c:/progra~1/php/sapi/php4apache2.dll

DirectoryIndex index.html index.htm index.php

AddType application/x-httpd-php .php

 『httpd.conf』の編集が終わったら、その内容を反映させるためにApacheを再起動する必要がある。Apache OKをダブルクリックし現れたダイアログで『Restart』を押すと、再起動される。

4.PHP起動の確認

 エディタで以下の内容を、『phpinfo.php』という名のファイルに保存し、そのファイルを『c:\Program Files\Apache2.0\Apache2\htdocs\』フォルダに保存する。

『phpinfo.php』の内容:
<?php phpinfo(); ?>

 ブラウザで『http://localhost/phpinfo.php』にアクセスすると、下のようなPHPのセットアップ情報が表示されるはずである。表示されたら、それは無事PHPのインストールが終了している証拠である。

<%image(20061111-php.png|427|270|phpinfo())%>

  • 注意:phpinfoの内容が一般に公開されているのはセキュリティー上好ましくないため、インストールがすべて終了したらこのファイルは削除するか、第三者には知られ得ないようなファイル名に変更すること。


5.PHPで使用するモジュールの指定

 実は、この状態ではPHPはデフォルトのままで起動されており、いろいろな設定がなされていない状態にある。これを行うには、『php.ini』という名のファイルを設定しなければならない。PHPインストールディレクトリに『php.ini-dist』というファイルがあるのでこれをコピーし、ファイル名を『php.ini』に書き換えた後、Windowsディレクトリ(Windows XPの場合は『C:\Windows』、Windows 2000の場合は『C:\WINNT』)に移動する。その内容を一部編集し、次のように変更した。ここでは、モジュールとして mb_string および GD を使用することを前提にしている。

『php.ini』の内容(抜粋):
include_path = ".;c:\progra~1\php\includes"

doc_dir = "c:\progra~1\apache2.2\htdocs"

extension_dir = "c:\progra~1\php\extensions"

extension=php_mbstring.dll
extension=php_gd2.dll

 Apacheを先述の方法で再起動し、もう一度『http://localhost/phpinfo.php』にアクセスしてみる。先には無かったmb_stringとGDに関する記述が追加されていればOKである。

GD and mb_string


6.SQLiteのインストールと、PHPへのモジュール追加

 いよいよSQLiteのインストールである。www.sqlite.orgから最新版の『sqlite.dll』をダウンロードして……と思いきや、ここからダウンロードされる『sqlite.dll』ではPHPに組み込めない。ここが私にしたら最難関であった。PHP用のSQLiteモジュールは、php.netから取得しなければならない。具体的には、http://pecl4win.php.net/ext.php/php_sqlite.dllにアクセスし、PHP4.4.1用の『php_sqlite.dll』をダウンロードして、PHPのモジュールディレクトリ(C:\Program Files\php\extensions\)にコピーする。さらに、php.iniに次の一行を追加する。

『php.ini』の内容(一行追加):
extension=php_sqlite.dll

 続けて上述の方法でApacheを再起動すれば、PHPにSQLiteが組み込まれるはずである。『http://localhost/phpinfo.php』にアクセスして、SQLiteの設定が表示されればOKである。

SQLite

7.Nucleus-SQLiteのインストール

 ここまでくれば、Nucleus-SQLite は簡単にインストールできる。Nucleus JP フォーラムから最新版を入手し、ダウンロードしたzipファイルを『C:\Program Files\Apache2.0\Apache2\htdocs\』内の任意のフォルダに解凍した後に、『install.php』にアクセスすれば、インストール完了だ。EUC版・UTF8版・英語版いずれもインストールが可能である。

install.php

Congratulations!


7.tips: 自宅サーバーを構築する場合

 Nucleus を、インストールするコンピュータ内でのみ使用するようなケースでは、『http://localhost/blog/install.php』のようなアクセスでインストールすれば良い。しかし、Nucleusを自宅サーバにインストールし、それを一般に公開する目的で使用するような場合で、自宅サーバがルータ(ファイアーウォール)の内側にある状態だと、このようにインストールすると自分のコンピュータからしかNucleusが正常に表示されない。
 そのようなケースでは、『hosts』ファイル(『system32\drivers\etc\』フォルダにある)を編集し、次の例のような一行を書き加える。

127.0.0.1       www.your.site.com

 Nucleus のインストールの際は、『http://www.your.site.com/blog/install.php』にアクセスするとよい。なお、上記の『127.0.0.1』は、家庭内LANに複数のコンピューターがあるケースでは、Nucleusをインストールするサーバに割り当てられたローカルIP(『192.168.1.1など』)を指定するとよい。
]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=228 Fri, 10 Nov 2006 18:23:00 PST ITEM228_20061110
Nucleus/pgSQL https://www.rad51.net/jeans/?itemid=218 (ここからダウンロードできます。)
(ノート:英語版で、α版です。PostgreSQL 版では、install.php で新たなデータベースの作成ができないので、PostgreSQL用のツールでISO-5589-1かそれ相当のエンコードのデータベースを別途作成して用いてください。)

PostgreSQL


(以下、pgSQL版作成ノート)

1)User functions の作成。

ユーザ関数定義の例
CREATE OR REPLACE FUNCTION match_against(VARCHAR,VARCHAR,VARCHAR,VARCHAR) RETURNS INTEGER AS '
DECLARE
    v_string1 ALIAS FOR $1;
    v_string2 ALIAS FOR $2;
    v_string3 ALIAS FOR $3;
    v_string4 ALIAS FOR $4;
BEGIN
    return 1;
END;
' LANGUAGE 'plpgsql';
]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=218 Mon, 25 Sep 2006 13:24:54 PDT ITEM218_20060925
Nucleus 3.3 β SQLiteのテスト https://www.rad51.net/jeans/?itemid=216
 うまくいくかなと試してみたが、installsqlite.php によるコアファイルの変更は問題なく行ったものの、Nucleus のインストール(install.php の実行)で山のようなエラーが。おまけに、fatal error でプロセスが停止してしまった。
 あぁ~、やっぱりメジャーなアップグレードにはついていけないのかとがっかりしたが、気を取り直してエラーを良く見てみると、原因判明!install.php では、SQLテーブルの構築が終わった後に一度 mysql_close し、もう一度 mysql_connect で接続しているのだが、SQLite ラッパーでこの再接続に対応していなかった。早速書き換え install.php を再実行してみると、無事にインストール終了。ほっと一息。
(ここからダウンロードできます。)]]>
Nucleus/SQLite https://www.rad51.net/jeans/?itemid=216 Wed, 13 Sep 2006 12:18:56 PDT ITEM216_20060913