更新
新居雅行/msyk@msyk.net
iVikingより配布しているFX.phpは、PHPからFileMaker Proのデータベースに接続するためのライブラリクラスです。FileMaker 7になってUnicode対応がWeb側にも行われ、FX.phpをそのまま使うことも可能で、その方法も紹介しましょう。しかしながら、FileMakerのデータベースから取り出した文字列をPHPで処理をしたい場合などに問題が発生します。そこで、非アスキーコード文字列対応のラッパークラスFX_charsetを利用することで問題は解決します。
PHPからFileMakerのデータベース処理を可能にするクラス「FX.php」のVer.4.0がリリースされました。このバージョンから、私の作った「日本語対応」部分が統合され、FX.phpだけで入出力部分のエンコードを指定できるようになっています。
Ver.4.0のChanges.txtの2項目目に私の名前が出ています。オープンソースソフトにいくらかでも貢献できたことにうれしく思うと同時に、このことは日本のFileMakerコミュニティでFX.phpを使っているみなさんの成果でもあります。これからもよろしくお願いします。(2005/8/14)
なお、Ver.4.0については、とりあえずはこのページにあるファイルはダウンロードしないで、本家のiViking.orgのFX.phpだけをダウンロードして利用できるはずです。よってこのページの内容は近々に修正をすることになるかと思います。
FX_charset(FX.php Ver.3.1対応)をダウンロードしてください。FX.php自体は再配布が可能なライセンスなので、この中に含めました。
PHPが稼働するWebサーバをご用意していただく必要があります。また、mb_stringが利用できるようになっている必要があります。なお、開発やテストは、Apache 1.3.33/PHP 4.3.2(Mac OS X v10.3.7)で行っています。
FX_charsetフォルダを、Webサーバのドキュメント内の適当な位置に配置すればOKです。
ライブラリの本体は、FX_charsetフォルダにあるFX_charset.phpです。これはラッパークラスで、FX.php自体は、FX_charset.phpと同じフォルダにあるFXフォルダに入っています。このフォルダ構成で稼働させるのが既定値ですが、もちろん、別ファイルの参照部分はPHPのプログラムソースを変更することで自由に変えて利用できます。
日本語文字変換では、mb_stringを使っています。LinuxなどUNIX系のみなさんは、ぜひとも、mb_stringをコンパイル時に指定するか、指定してビルドされたものを使ってください。もっとも、コード変換部分はiconvで置き換えは可能とは思います。
Windows版のPHPでは、mb_stringにネイティブのライブラリを使うようです。mb_stringの部分で「関数がない」というエラーが出る場合には、たとえば、次の点などをよく確認してください。
phpの設定が入っているphp.iniにある以下の行を有効に(行頭に;がない状態に)してみてください。php.iniファイルはphpinfo()コマンドで表示される情報に書き込まれていますが、たとえば、c:¥apache¥apache¥php.iniなどとなっているようです。
extension_dir = "c:/php/extensions/" extension=php_mbstring.dll
サンプルとして、書籍のデータベースがあって、それを一覧表示したり、入力、検索、詳細表示ができるようなPHPのソースが付属しています。オリジナルのFX.phpにあったものを改良しましたが、FileMaker 7のみのデータベースです。必要なアクセス権設定をしています。ただし、[完全アクセス]が可能なadminアカウントにはパスワードをかけていませんし、ゲストも[完全アクセス]となりますので、実際の運用ではご注意ください。
データベースファイルのBook_List.fp7を、FileMaker Server 7で公開します。さらに、FileMaker Server 7 AdvancedのWeb公開エンジンを稼働させて、このデータベースへXMLアクセスが可能になるようにします。
/FX_charset/index-utf8.phpを開きます(もちろん、配置した場所に応じてホスト名やパス名を付けて正しいURLでアクセスをしてください)。書籍のリストが見えていればOKです。書籍名のリンクをクリックすると、書籍の詳細ページ(detail-utf8.php)に移動します。入力や検索も、通常とおり日本語についても可能なので、試してみてください。
サンプルをファイルメーカーPro 6で使う場合、詳細表示の画面で画像がそのままでは出てきません。そこで、detail-*.phpファイルの一部を修正してください。以下のように、赤い文字のスラッシュを追加してください。「cover_art 」で検索すれば、その場所がすぐに分かると思います。(お知らせいただいた森さん、ありがとうございます。)
<td align="center" valign="center" bgcolor="#FFFFFF" width="125" rowspan="4"> <img src="<?php echo "http://$serverIP:$webCompanionPort/" . $BookData['data'][$currentKey]['cover_art'][0]; ?>" width="200"> </td>
本当はFX.php自体の詳しい使い方を日本語でご紹介しないといけないのですが、とりあえず、オリジナルの英語の文書をご覧ください。その上で、FX_charset.phpの使い方を紹介します。
サンプルのデータベースを使って、FXとFX_charsetの違いが分かるようにしました。書籍の一覧から、書籍名をクリックして、詳細ページに移動します。そのとき、TitileフィールドのデータをPHPで1文字ずつに分割した結果を表の下に表示します。日本語の書籍名の「メールシステムの作り方大全」(手前味噌ですみません…)をクリックしてください。
detail-utf8.phpは、FX_charsetを使ってUTF-8ベースで稼働させています。そのため、データベースから得られた文字列は、UTF-8形式の文字列です。そのため、1文字目は「メ」、3文字目は「ル」などと、mb_substr関数で得られる1文字と、データベースに記録される文字列の1文字は対応しています。
一方、index-fx.phpから書籍名のリンクをクリックして表示されるdetail-fx.phpにおいても、とりあえずは日本語は文字化けしませんし、入力や検索もうまく行きます。しかしながら、Titleフィールドの文字列を1文字ずつ取り扱うと、以下の図のようになります。たとえば、「メ」は、Unicodeではコードポイントとしては12513(0x30E1)ですので、文字列参照(character reference)形式だと「メ」とソースコード上で展開されます。HTMLのソースに文字列参照が含まれている場合、ブラウザでレンダリングして正しく「メ」と表示されますので、単にブラウザ表示をする上では問題がありません。しかしながら、PHPで文字列として処理しようと思うとそのままではうまく行きません。もちろん、PHPで変換関数などを作る…という手段もあるかもしれませんが、FXのラッパーとして、普通に文字列が得られるようにしてみました。
FX_charsetではなくFXで日本語を利用する方法を説明しておきましょう。FileMaker Server 7 AdvancedではUnicode対応によりそれも可能です。一方、Ver.6までのファイルメーカーでの利用はできません。また、前記の問題がありますが、単にページ表示をしたいだけならFXでも問題はありません。
<? header('Content-Type: text/html;charset=utf-8'); ?>
FX_charsetはFXをもとにしているので、FXの機能はそのまま使えます。コンストラクタや、あるいはメソッドなどはすべてそのまま使えるはずです。加えて、外部仕様的には2つのメソッドを利用するようになっています。ただし、これらは常に使う訳ではありませんので、状況に合わせて設定をしてください。
追加メソッド | 解説 |
---|---|
SetCharacterEncoding($encoding) | データベースから得られたデータを、このメソッドの引数で指定した文字セット/エンコーディングの文字列に変換する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。 |
SetDataParamsEncoding($encoding) | データベースへのリクエストに含める文字列の文字セット/エンコーディングを指定する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。 |
作成するPHPのページがUTF-8で稼働する場合には、以下の点を注意します。
<? header('Content-Type: text/html;charset=utf-8'); ?>
mb_internal_encoding('utf8');
mb_http_output('utf8');
作成するPHPのページがEUCで稼働する場合には、以下の点を注意します。
<? header('Content-Type: text/html;charset=EUC-JP'); ?>
$BookQuery = new FX_charset($serverIP, $webCompanionPort, 'FMPro7');
$BookQuery->SetCharacterEncoding('EUC-JP');
$BookQuery->SetDataParamsEncoding('utf8');
mb_internal_encoding('EUC-JP');
mb_http_output('EUC-JP');
ファイルメーカーPro Ver.6まで、あるいはUnlimited版で、日本語をきちんと使うには、FX_charsetが必須です。FX.phpでは、データベースの内容の参照しかできず、入力や検索などは思った通りに動きません。もともと、そのことがあってFXを日本語化したのですが、FX_charsetでも従来のファイルメーカーPro Ver.6で稼働するようにソースは残してあります。
ファイルメーカーPro 6までで使う場合には、Webコンパニオンをオンにして、データベースを公開します。そして、PHPのソースでは以下の点に気をつけます。
<? header('Content-Type: text/html;charset=EUC-JP'); ?>
$fx = new FX_charset( ..., 'FMPro5/6' ); $fx->SetCharacterEncoding('EUC-JP'); $fx->SetDataParamsEncoding('SJIS');
なお、UTF-8で使う場合は、ヘッダとSetCharacterEncodingの引数を、'utf8' にすればいいでしょう。
なお、この方法を使うと、WebサーバとファイルメーカーProを同一マシンにすれば、つまりはファイルメーカーProへのアクセスは127.0.0.1のIPアドレスからの接続だけになります。従って、Webサーバへの接続がどこからでも、ファイルメーカーへは127.0.0.1経由の接続だけになり、結果的にUnlimited版を購入しなくても、多数のユーザがWeb経由で接続が可能です。しかしながら、こうした使い方は使用許諾上許されていませんので、10ユーザ以上の利用がある場合は、ファイルメーカーProはUnlimited版をご利用ください。