ランダム順で取得
データをランダムに取得するには、たいていどのような仕組みにでも乱数ジェネレータ(もしくはそれらしきもの)が用意されていて、それを利用するのが便利。MySQLからランダムに値を取得する場合、以下のようにORDER BY句にRAND()関数をかませると、ランダムな順番で取得できる。
SELECT * FROM table ORDER BY RAND();
ランダムに3つ取得したいならLIMIT 0,3とかつけてあげればよい。
「便利に使えそう」と期待しているSQLiteだが、もろもろウェブを検索すると「断然SQLite3にすべき」という記述が多い。当然多機能だろうかバージョンが上のほうがいいに決まっているのだが・・・。
SQLite2の場合、本来は一度作ったテーブルの修正はできないらしい。つまりalterコマンドがないのだ(SQLite3から実装されたらしい)。これは確かに不便だ。
SQLiteManagerではいちおうSQLite2でもテーブルでカラムの追加や削除、修正ができる。これは以下の手順を踏んでいるらしいことがわかった。
(1) 元テーブルと同じ構造のテンポラリテーブルを作成
(2) テンポラリテーブルに元テーブルのデータを挿入
(3) 元テーブルを削除
(4) 希望のテーブルを新規で作成
(5) テンポラリテーブルに入れたデータを新規作成テーブルに挿入
(6) テンポラリテーブルを削除
上記の操作をトランザクションに囲んで処理させているようだ(本当はどうだかソースを読んでいないのでわからないけれど)。トランザクションをサポートしているのにテーブルの修正ができないとは・・・。まぁトランザクションのほうがあったほうがいいけれど、それでもテーブルの修正が容易でないというのは開発段階では致命的。
でもPHP5ではデフォルトではSQLite2しかサポートしていない。しょうがなしにSQLite2を使っていくということになるのだが・・・。早めに改善を希望する部分だな。
SQLiteManagerを活用してがんばってSQLiteを使っている。PHP4でSQLiteが使える環境があったのでそちらにも設置してみた。基本的には動作しているようだが、なぜかUTF-8化を実施すると以下のエラーが出る。
Warning: cannot yet handle MBCS in html_entity_decode()
htmlentity関連のエラーだ。マルチバイト文字はhtmlentity関数との相性がよくないような気がする。さて、これを解消する方法は以下の通り(include/common.lib.phpを修正)。
(1) 上記ファイルのどこか適当なところに以下の関数を記述する。
function unhtmlentities($string)
{
$string = preg_replace(‘~&#x([0-9a-f]+);~ei’, ‘chr(hexdec(“¥¥1″))’, $string);
$string = preg_replace(‘~&#([0-9]+);~e’, ‘chr(¥¥1)’, $string);
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
(2) 元ファイル中で133行目、180行目、184行目ででてくるhtml_entity_decode関数を上記のunhtmlentities関数で書き換える。その際2つ目以降の引数はばっさり切り取る。
以上でOK。正しく表示された。多分標準の関数を自前処理の関数で置き換えた、ということだろう。
SQLiteはPHP5から標準で使えるようになった機能だ。しかしPHP4でも使える場合がある。
どんな具合になっているのか。
SQLite関連はPECLライブラリで開発されていたので、モジュール拡張されていれば使用できるということになる。つまりモジュール「sqlite.so」が組み込まれていればいい。これを確認するにはphpinfo()関数を実行するのが手っ取り早い。
表示された中でsqliteがあればOK。
たいていの共用レンタルサーバではMySQLが使用可能だけど、作成できる個数が限定されていることが多い。つまりデータベースが無制限に作成できるわけではないから、自ずとひとつのデータベースの中でプレフィックス文字列を変更するなどして使うことになるのだが、必然的にテーブル数が増えて視認性・操作性が悪くなる。SQLiteの場合は単にファイルを生成するだけだから、容量さえ契約の上限を守っていればいくつでも作成可能なわけだ。つまり作りたいだけ作ることができる。これは魅力的だ。
自分にとってはファイルひとつコピーするだけでバックアップできるところが一番の魅力でもある。
そんなお手軽なSQLite。PHP5が一般的になって、対応アプリが増えれば絶対に流行るとは思うのだが・・・。
SQLiteなんて比較的新しいのだから言語なんてUTF-8で当然!、とか思っていたら全然そんなことないようだ。もちろんSQLiteは多言語対応しているが、SQLite ManagerではEUC-JPしか使えないようだ。
やっぱりUTF-8で使いたい訳なのだが、すでに有名どころな方がUTF-8を使えるようにしてくれていた。さすが。
まず以下のリンクで必要ファイルをダウンロードする。
ファイル
そしてinclude/defined.inc.phpを修正する(下記の配列の14番目を追加)。
$availableLangue = array( 1=>’french’, 2=>’english’, 3=>’polish’,
4=>’german’, 5=>’japanese’, 6=>’italian’,
7=>’croatian’, 8=>’brazilian_portuguese’, 9=>’dutch’,
10=>’spanish’, 11=>’danish’, 12=>’traditional_chinese’,
13=>’simplified_chinese’,14=>’japanese_utf8′);
これだけでオッケー。言語の選択画面でいったんjapaneseを選択すると、以降の画面でUTF-8が選択できるようになった。
これでやっと目的どおりの環境になった。SQLiteは何がいいって、バックアップとるのが簡単。何しろ単なるファイルだからね。チャンスがあればこれからバリバリ使う予定だ。