まずは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」拡張アクセス権を付与しておく必要がある。

拡張アクセス権の編集で「fmxml」キーワードにアカウントを指定しておく

ファイル作成、拡張アクセス権の設定をおこなったあとにFileMaker Serverで該当のファイルを公開する。また、FileMaker Server側の設定で「XMLによるWeb公開」が有効になっているかを確認しておこう。

FileMaker Serverでファイルを公開した。XML欄にチェックが入っている

FileMaker ServerのWeb公開エンジン構成で、XML公開が有効になっているかを確認しておこう

これでデータベース側の準備は終了だ。では実際に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);

?>

このサンプルコードでは、次の順に処理をおこなっている。

  1. new FXでFXオブジェクトを作成 - 作成時にFileMakerサーバのIPアドレス、ポート、データソースタイプ、スキーマを指定
  2. SetDBDataで使用するデータベースとレイアウトを指定
  3. SetDBUserPassでファイルを開くためのユーザIDとパスワードを指定
  4. AddDBParamでtestTextフィールドに格納したい文字列を指定 - ここでは$_SERVER['HTTP_USER_AGENT'](ユーザエージェント)をtestTextに格納する
  5. FMNew()でリクエスト発行
  6. var_dumpで結果を表示

このPHPファイルをターミナル上で実行するか、WebサーバのドキュメントパスにデプロイしてWebブラウザから表示してみよう。

WebブラウザからPHPを実行

ターミナル上で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) {
  }
}

FileMakerファイルにレコードが登録されている

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(作成・読出・更新・削除)の実装方法をひととおり紹介する。