まずはFileMakerのデータにレコードを追加するところからはじめてみよう。ここでの動作環境は次のとおり。
- FileMaker Pro: FileMaker Pro Advanced 10.0v1 (Mac OS X 10.5.6)
- FileMaker Server: FileMaker Server 9.0.3.325 (Windows Server 2003 SP2)
- PHP: 5.2.8 (FreeBSD 8.0-current)
FileMaker上で単一テーブルの簡単なデータベースを作成しておく。ここでは次の情報でファイルを作成した。
- ファイル名: fxphp_test.fp7
- テーブル名: testTable
- レイアウト名: testLayout
- フィールド名: t_testText
そのほかのフィールドは、レコードの登録日時や更新日時・ユニークなシリアルナンバを格納するためのフィールドだ。Webアプリケーション化するしないに関わらず、これらの情報は障害対応時、機能追加といったさまざまな場面で必要になるケースが多い。かならず作成するようにしておこう。
FX.phpではFileMaker Serverの「XMLによるWeb公開」機能を利用してFileMakerとの通信を実現している。あらかじめWebアプリケーションとして利用したいファイルには、アカウントとアクセス権の管理より「fmxml」拡張アクセス権を付与しておく必要がある。
ファイル作成、拡張アクセス権の設定をおこなったあとにFileMaker Serverで該当のファイルを公開する。また、FileMaker Server側の設定で「XMLによるWeb公開」が有効になっているかを確認しておこう。
これでデータベース側の準備は終了だ。では実際にFX.phpを利用してさきほど作成・公開したFileMakerファイルのテーブルにレコードを作成してみよう。サンプルコードは次のとおり。
PHPファイル - fm_new.php
<?php
include_once('./fx/FX.php');
$data = new FX('(サーバのIPアドレスまたはドメイン名)', 80, 'FMPro9', 'http');
$data->SetDBData('fxphp_test','testLayout');
$data->SetDBUserPass('admin','admin');
$data->AddDBParam('t_testText',$_SERVER['HTTP_USER_AGENT']);
$dataSet = $data->FMNew();
var_dump($dataSet);
?>
このサンプルコードでは、次の順に処理をおこなっている。
- new FXでFXオブジェクトを作成 - 作成時にFileMakerサーバのIPアドレス、ポート、データソースタイプ、スキーマを指定
- SetDBDataで使用するデータベースとレイアウトを指定
- SetDBUserPassでファイルを開くためのユーザIDとパスワードを指定
- AddDBParamでtestTextフィールドに格納したい文字列を指定 - ここでは$_SERVER['HTTP_USER_AGENT'](ユーザエージェント)をtestTextに格納する
- FMNew()でリクエスト発行
- var_dumpで結果を表示
このPHPファイルをターミナル上で実行するか、WebサーバのドキュメントパスにデプロイしてWebブラウザから表示してみよう。
ターミナル上でPHPを実行した結果
array(9) {
["data"]=>
array(1) {
["11.0"]=>
array(4) {
["t_testText"]=>
array(1) {
[0]=>
string(0) ""
}
["t_serialNo"]=>
array(1) {
[0]=>
string(2) "11"
}
["t_registTimeStamp"]=>
array(1) {
[0]=>
string(19) "02/24/2009 11:39:20"
}
["t_updateTimeStamp"]=>
array(1) {
[0]=>
string(19) "02/24/2009 11:39:20"
}
}
}
["linkNext"]=>
string(0) ""
["linkPrevious"]=>
string(0) ""
["foundCount"]=>
int(1)
["fields"]=>
array(4) {
[0]=>
array(5) {
["emptyok"]=>
string(3) "YES"
["maxrepeat"]=>
string(1) "1"
["name"]=>
string(10) "t_testText"
["type"]=>
string(4) "TEXT"
["extra"]=>
string(0) ""
}
[1]=>
array(5) {
["emptyok"]=>
string(3) "YES"
["maxrepeat"]=>
string(1) "1"
["name"]=>
string(10) "t_serialNo"
["type"]=>
string(6) "NUMBER"
["extra"]=>
string(0) ""
}
[2]=>
array(5) {
["emptyok"]=>
string(3) "YES"
["maxrepeat"]=>
string(1) "1"
["name"]=>
string(17) "t_registTimeStamp"
["type"]=>
string(9) "TIMESTAMP"
["extra"]=>
string(0) ""
}
[3]=>
array(5) {
["emptyok"]=>
string(3) "YES"
["maxrepeat"]=>
string(1) "1"
["name"]=>
string(17) "t_updateTimeStamp"
["type"]=>
string(9) "TIMESTAMP"
["extra"]=>
string(0) ""
}
}
["URL"]=>
string(120) "http://admin:admin@(サーバのIPアドレスまたはドメイン名)/fmi/xml/FMPXMLRESULT.xml?-db=fxphp_test&-lay=testLayout&-max=50&t_testText=&-new"
["query"]=>
string(0) ""
["errorCode"]=>
string(1) "0"
["valueLists"]=>
array(0) {
}
}
PHPが実行されたと同時に、FileMakerのファイルにレコードが登録される。実行結果はXMLとして取得され、FX.phpによって配列として格納される。配列に格納される情報は次のとおり(マニュアル「/Documentation/FXDataFormat.pdf」より抜粋)。
- $ReturnedData['linkNext'] - 次ページへのアンカーが格納される
- $ReturnedData['linkPrevious'] - 前ページへのアンカーが格納される
- $ReturnedData['foundCount'] - リクエスト結果の対象レコード数が格納される
- $ReturnedData['fields'] - フィールド名、タイプ、空欄可否といったフィールド情報が格納される
- $ReturnedData['data'] - 取得したレコード情報が格納される
- $ReturnedData['URL'] - 通信に使用したURLが格納される
- $ReturnedData['errorCode'] - FileMakerエラーが格納される。別途FileMakerのヘルプを参照
- $ReturnedData['valueLists'] - 値一覧情報が格納される(FMViewを使用した場合のみ)
URLを見ていただければわかるとおり、このコードでFX.phpがおこなっている内容はFileMakerの「XMLによるWeb公開」の仕様に沿ってHTTPリクエストを生成し、発行、その結果を配列に格納しているだけだ。FileMakerを使用したWebアプリケーションの実装中に行き詰まった場合は、おかしな引数が混じっていないかどうか、まずは実際に発行されているHTTPリクエストを見るようにしよう。また配列に格納されたエラーコードをもとにすればエラー処理を実装することが可能だ。FX.phpの主要な関数・メソッドは次のとおり(マニュアル「/Documentation/FXFunctions.pdf」より抜粋)。
- First Function to Call -
FX - FXオブジェクトを作成する。作成時にFileMakerサーバへ接続するための情報(IPアドレスまたはドメイン, ポート番号, データタイプ, スキーマ)を指定する
- Next Functions to Call -
SetDBData - 使用するデータベース情報(データベースファイル名, レイアウト名, 一度に取得するレコード数, レスポンスレイアウト)を指定する
SetDBPassword / SetDBUserPass - データベースファイルを開くために使用するユーザ名・パスワードを指定する
SetCharacterEncoding / SetDataParamsEncoding - UTF-8以外の文字コードを使用する場合は、ここでデータのやり取りに使用する文字コードを指定する。使用するにはPHP側でmbstringモジュールが有効になっている必要がある
AddDBParam / AddDBParamArray - フィールドに格納したい内容を指定する
SetRecordID / SetModID - それぞれレコードID(-recid)、修正ID(-modid)を指定する。AddDBParam('-recid', レコードID)でも代用可
PerformFMScript / PerformFMScriptPrefind / PerformFMScriptPresort - 処理完了時、検索時、ソート時のいずれかのタイミングで実行したいスクリプトを指定。スクリプトはあらかじめWeb公開との互換をもった構成で作成しておく必要がある。AddDBParam('-script', スクリプト名)でも代用可
AddSortParam - ソートに使用するフィールド、ソート順、ソート優先順位を指定する
FMSkipRecords - 対象レコードが複数の場合、先頭から数えて除外したいレコード数(-skip)を指定する。AddDBParam('-skip', 除外したいレコード数)でも代用可
- Last Functions to Call -
FMNew - レコードの登録(-new)を実行する
FMEdit - レコードの編集(-edit)を実行する。編集にはレコードID(-recid)を指定する必要がある
FMFind - レコードの検索(-find)を実行する
FMFindAll - レコードの全件表示(-findall)を実行する
FMFindAny - レコードをランダムに1件抽出する(-findany)
FMView - レイアウト情報を取得する(FMPXMLLAYOUT.xmlを使用)
FMDup - レコードの複製(-dup)を実行する。複製にはレコードID(-recid)を指定する必要がある
FMDelete - レコードの削除(-delete)を実行する。削除にはレコードID(-recid)を指定する必要がある
DoFXAction - あらかじめカスタマイズしたクエリを発行する
このほかFileMaker Server側で用意されている機能は、FileMaker Serverに同梱されているドキュメント「FMS9_CWP_PHP_ja.pdf」などを参照されたい。
今回は一部の関数・メソッドを省略して紹介したが、それでもご覧になったとおりのボリュームだ。一度に覚えるのはなかなかむずかしいので、何回も数をこなして次第に覚えていこう。慣れないうちは他人の書いたコードを改変しながら使い方を覚えていくのが近道だ。さいわいFX.phpにはチュートリアル(/Tutorials/)が用意されているので、これらも参考にしてほしい。次回はFX.phpによるCRUD(作成・読出・更新・削除)の実装方法をひととおり紹介する。