FileMakerのWebアプリの実装・デバッグの際に必要になる「FileMaker エラーコード」と「FileMaker ServerへのリクエストURI」。実装中やデバッグ中になにか動作がおかしいな? と思ったら、まずはDEBUG定数を定義して、FX.phpのデバッグモードを有効にする--これでWebブラウザ上に「FileMaker ServerへのリクエストURI」が表示されるようになる。コマンドラインのツールを自作して、これらの情報からすぐに「何が起きているか」を知れる状態にしておこう。

FileMaker Webアプリのデバッグの際に有用なツールを自作する

FileMakerなWebアプリの実装・デバッグの際に必要になる「FileMaker エラーコード」と「FileMaker ServerへのリクエストURI」。実装中やデバッグ中になにか動作がおかしいな? と思ったらまずはDEBUG定数を定義して、FX.phpのデバッグモードを有効にする--これでWebブラウザ上に「FileMaker ServerへのリクエストURI」が表示されるようになる。このURIを解析して「どのようなパラメータが投げられているか」を知り、結果として「どのエラーコードが返っているか」を確認することが可能だ。

このFileMaker ServerへのリクエストURIだが、URLエンコードされており、マルチバイトのレイアウト名やフィールド名/フィールド値が渡されていると、可読性に欠ける内容となる。

マルチバイトのレイアウト名やフィールド名/フィールド値を使用していると、パッと見でどのフィールドにどのような文字列が渡されているかわかりにくい

また、このURIを参照するとFMPXMLRESULT文法のXMLが返るのだが、このFileMakerエラーコード(errorCode)も数字のみの内容で、パッと見どのようなエラーが起きているのかが分かりづらい。

FileMakerのFMPXMLRESULTにはエラー番号のみが返り、エラー内容までは返らない

このようなちょっとしたデバッグの際に、いちいちFileMaker Proを起動してヘルプを参照したり、urldecodeがおこなえるWebサービスを使用するのは手間がかかる。本コラムではFileMakerとPHPでWebアプリケーションを実装するティップスを紹介してきた。せっかくなので、これらのデバッグツールもPHPで用意してみよう。

ターミナル上でphpdecodeを実行し、FileMaker ServerへのリクエストURIをすぐに読めるように

ターミナルのパスが通っているディレクトリに、urldecodeというファイルを作成する。ファイルの内容は次のとおり。

#!/usr/bin/php

<?php
if ( '' === (string)$argv[1])
{
    echo 'usage' . "\n";
    echo '    urldecode keyword';
    echo "\n";
    exit;
}
echo '----' . "\n";
echo urldecode($argv[1]) . "\n";
echo '----' . "\n";
?>

このPHPスクリプトでは、引数中のエンコードされた文字列をurldecode()で復元して返す。作成したファイルにchmodで実行権限を与え、動作を確認してみよう。

ターミナル上でさきほどのFileMaker ServerへのリクエストURIをurldecodeしたもの

マルチバイトのフィールド名がある環境でFileMakerエラー102(フィールドが見つかりません)が返るようなバグを出してしまった場合、FileMaker ServerへのリクエストURIを目視で確認するのは大変だ。あらかじめこのようなコマンドを用意しておけば、URIを全文コピーして、ターミナルでこのコマンドを実行するだけで簡単にフィールド名を復元できる。

さらにクエリ中の&で改行をはさんで表示するようにすれば、フィールド名とフィールド値を一目で確認できるようになる。さきほどのファイルをベースに、fm_urldecodeというスクリプトファイルを作成する。

#!/usr/bin/php

<?php
if ( '' === (string)$argv[1])
{
    echo 'usage' . "\n";
    echo '    fm_urldecode keyword';
    echo "\n";
    exit;
}
echo '----' . "\n";
echo str_replace('&', "\n", urldecode($argv[1])) . "\n";
echo '----' . "\n";
?>

さきほどと同じ引数を与えてコマンドを実行してみよう。

FileMaker ServerへのリクエストURIをurldecodeし、&を改行に置換して出力。FileMaker Serverに投げられているフィールド名とフィールド値を一目で確認できるようになった

フィールド名やレイアウト名にはマルチバイトを含めないほうが無用なトラブルを避けられるが、要件の都合でやむをえない場合がある。簡単なスクリプトだが、このような時にさくっとデコードができるので便利だ。

FileMakerエラーコード

さきほどとおなじ要領で、FileMakerのエラーコードをターミナルで入力すると、そのエラー内容を確認できるコマンドを作ってみよう。コマンド名はfm_errorとした。ファイルの内容は次のとおり。

#!/usr/bin/php
<?php
if ( '' === (string)$argv[1])
{
    echo 'usage' . "\n";
    echo '    fm_error errorCode';
    echo "\n";
    exit;
}
include_once('FMErrors.php');

echo '----' . "\n";
echo 'FileMaker Error: ' . $argv[1] . "\n";
echo $errorsList[$argv[1]] . "\n";
echo '----' . "\n";
?>

このファイルではFX.phpの成果物に同梱されているDeveloper/FMErrors.phpを利用している。FMErrors.phpは、グローバルの変数にFileMakerのエラー番号とエラー内容の配列が定義されたファイル。これをインクルードし、引数のエラー番号を使用してエラー内容を返すというプログラムだ。

ためしに引数をつけてこのプログラムを実行してみよう。

ターミナル上で % fm_error 807 と実行。File is not a FileMaker Pro file or is severely damagedと返り、エラーを返したFileMakerファイルが重大な損傷を受けているということがわかる

エラー番号を見つけていちいちFileMaker Proを起動し、ヘルプ「FileMaker Pro エラーコード」を参照しなくとも、あらかじめこのスクリプトを用意しておけば、わずかな手順でFileMaker Proのエラーを把握することが可能となる。

このようなツールはわずかな時間で作成できる上、活用頻度もおおい。FileMakerに限らず、一定の処理を繰り返していて「この作業はもっとシンプルにできそうだ」と感じたら、積極的にツール化をおこない、処理を単純にしてみよう。今回はFileMakerのデバッグ作業に焦点をあてたが、たとえばFileMakerのスクリプトステップの互換性チェックや、FileMaker製品の旧バージョンの動作表/互換性確認プログラムなど、作成・使用するツールはターミナル上のプログラムに限らなくても良い。FileMaker Proファイルでも同様のチェックツールは作成することが可能だ。作業用のツールをいくつか常備しておき、いつもおこなう処理をより簡単に素早くこなせるようになっておこう。