FileMaker API for PHPの機能もひととおりの紹介を終えた。そこで今回からは、FX.phpとの動作や書き方の違い、返り値の取扱い方や動作のパフォーマンス・サーバにかかる負荷などを比較していきたいと思う。まずはレコード登録機能についておさらいしておこう。

レコードの登録方法 - FX.php / API での違い

まずはレコードの登録~返り値の相違点をチェックだ。

  FX.php API 備考
フィールド設定 AddDBParam setField, setFieldFromTimestamp, createRecord FX.phpにはsetFieldFromTimestampに相当する機能がない
リクエスト発行 FMNew, DoFXAction('new') execute, commit  
返り値のタイプ 配列 object FileMaker_Result, object FileMaker_Error, boolean true FX.phpで同時取得できるのは空欄不可・繰り返し数・フィールドタイプの3点で、ほかのオプション情報は取得できない。APIでは各種結果を取り出すのに各メソッドを使う必要あり

FX.phpでレコードを登録、結果を取得するまでの手順

  1. new FXでインスタンスを作成、接続先を指定
  2. AddDBParamでフィールドに登録したい内容を指定
  3. FMNewまたはDoFXAction('new')でリクエスト発行
  4. 結果を配列で取得
  5. $resultSet['errorCode']の値でエラー判定
  6. $resultSet['data']からフィールド内容を取得

APIでレコードを登録、結果を取得するまでの手順

  1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
  2. newAddCommandでFileMaker_Command_Addオブジェクトを作成
  3. setField, setFieldFromTimestampでフィールドに登録したい内容を指定
  4. executeでリクエスト発行
  5. 成功した場合はFileMaker_Resultオブジェクトが、失敗した場合はFileMaker_Errorオブジェクトが返る
  6. FileMaker::isErrorでエラー判定
  7. getFirstRecordやgetRecordsでFileMaker_Recordオブジェクトを取得
  8. getFieldやgetFieldUnencodedでフィールド内容を取得

APIでレコードを登録 (結果を取得しないパターン)

  1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
  2. createRecordでレコードオブジェクトを作成
  3. setField, setFieldFromTimestampでフィールドに登録したい内容を指定
  4. commitでリクエスト発行
  5. 成功した場合はtrueが、失敗した場合はFileMaker_Errorオブジェクトが返る
  6. FileMaker::isErrorでエラー判定

FX.phpではひとつひとつの処理が大変シンプルに書けるようになっている。FileMaker API for PHPでは多機能な分、FX.phpと比較すると、レコードを作成するまでの手順が多い。

では実際に動作するサンプルを書いてみる。フィールド2つに対して値をセットしてレコードを登録、レイアウトに配置されているフィールド内容の結果を表示する簡単なスクリプトだ。使用するレイアウトは前回使用したものと同じとする。

FileMaker DB情報 名前
ファイル名 fmapi_test.fp7
テーブル名 fmapi_table
レイアウト名 fmapi_list

FX.phpの場合 - fx_new.php

<?php

include_once('../fx/FX.php');
include_once('../fx/FX_Fuzzy_Debugger.php');

// 文字列エスケープ用関数
function h($string)
{
    return htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
}

// 1. FXインスタンスを作成、接続先を指定
$data = new FX('localhost', 80, 'FMPro9', 'http');
$data->SetDBData('fmapi_test','fmapi_list');
$data->SetDBUserPass('admin','admin');

$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');

// 2. AddDBParamでフィールドに登録したい内容を指定
$data->AddDBParam('ft_text', 'fx_new.phpよりレコード作成');
$data->AddDBParam('ft_date', date('m/d/Y'));

// 3. FMNewまたはDoFXAction('new')でリクエスト発行
// 4. 結果を配列として取得し、$resultSetに格納
$resultSet = $data->FMNew();
// $resultSet = $data->DoFXAction('new'); でも可

// 5. $resultSet['errorCode']の値でエラー判定
if ( 0 === (int)$resultSet['errorCode'] )
{
    // 6. $resultSet['data']からフィールド内容を取得
    echo '<table border="1">';
    foreach( $resultSet['data'] as $recordValue )
    {
        foreach( $data->lastFields as $fieldValue )
        {
            echo '<tr>';
            echo '<th>' . $fieldValue['name'] . '</th>';
            echo '<td>' . h($recordValue[$fieldValue['name']][0]) . '&nbsp;</td>';
            echo '</tr>';
        }
        unset($fieldValue);
    }
    unset($recordValue);
    echo '</table>';
}
else
{
    // エラー処理
    echo '<table border="1">';
    echo '<tr>';
    echo '<th>FileMakerエラーコード</th>';
    echo '<td>' . $resultSet['errorCode'] . '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<th>エラー内容</th>';
    echo '<td>' . $errorsList[$resultSet['errorCode']] . '</td>';
    echo '</tr>';
    echo '</table>';
}
?>

APIの場合(1) - api_new_1.php

<?php

include_once('../FileMaker.php');

// 文字列エスケープ用関数
function h($string)
{
    return htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
}

// 1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');

// 2. newAddCommandでFileMaker_Command_Addオブジェクトを作成
$newCommand = $data->newAddCommand('fmapi_list');

// 3. setField, setFieldFromTimestampでフィールドに登録したい内容を指定
$newCommand->setField('ft_text', 'api_new_1.phpよりレコード作成');
$newCommand->setFieldFromTimestamp('ft_date', mktime(0,0,0, date('m'), date('d'), date('Y')));

// 4. executeでリクエスト発行
// 5. 成功した場合はFileMaker_Resultオブジェクトが、失敗した場合はFileMaker_Errorオブジェクトが返る
$resultSet = $newCommand->execute();

// 6. FileMaker::isErrorでエラー判定
if (!FileMaker::isError($resultSet))
{
    // 7. getFirstRecordやgetRecordsでFileMaker_Recordオブジェクトを取得
    echo '<table border="1">';
    foreach ( $resultSet->getRecords() as $record )
    {
        foreach( $record->getFields() as $fieldName )
        {
            // 8. getFieldやgetFieldUnencodedでフィールド内容を取得
            echo '<tr>';
            echo '<th>' . $fieldName . '</th>';
            echo '<td>' . h($record->getFieldUnencoded($fieldName)) . '&nbsp;</td>';
            echo '</tr>';
        }
        unset($fieldValue);
    }
    echo '</table>';
}
else
{
    // エラー処理
    echo '<table border="1">';
    echo '<tr>';
    echo '<th>FileMakerエラーコード</th>';
    echo '<td>' . $resultSet->getCode() . '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<th>エラー内容</th>';
    echo '<td>' . $resultSet->getMessage() . '</td>';
    echo '</tr>';
    echo '</table>';
}
?>

APIの場合(2) - api_new_2.php

<?php

include_once('../FileMaker.php');

// 文字列エスケープ用関数
function h($string)
{
    return htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
}

// 1. new FileMakerでFileMakerのインスタンスを作成、接続先を指定
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');

// 2. createRecordでレコードオブジェクトを作成
$recordObject = $data->createRecord('fmapi_list');

// 3. setField, setFieldFromTimestampでフィールドに登録したい内容を指定
$recordObject->setField('ft_text', 'api_new_2.phpよりレコード作成');
$recordObject->setFieldFromTimestamp('ft_date', mktime(0,0,0, date('m'), date('d'), date('Y')));

// 4. commitでリクエスト発行
// 5. 成功した場合はtrueが、失敗した場合はFileMaker_Errorオブジェクトが返る
$result = $recordObject->commit();

// 6. FileMaker::isErrorでエラー判定
if (!FileMaker::isError($result))
{
    // エラーなし
    echo 'done.';
}
else
{
    // エラー処理
    echo '<table border="1">';
    echo '<tr>';
    echo '<th>FileMakerエラーコード</th>';
    echo '<td>' . $resultSet->getCode() . '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<th>エラー内容</th>';
    echo '<td>' . $resultSet->getMessage() . '</td>';
    echo '</tr>';
    echo '</table>';
}
?>

これまで紹介してきた機能を活用し、フィールド名とフィールド内容のセルを自動で生成・出力している。うろ覚えになっている機能がある場合は、本コラムのバックナンバーを参照されたい。では実際にWebブラウザで動作を確認してみる。

fx_new.phpにアクセスしてレコードを作成。フィールド情報を$data->lastFieldsより、レコード情報を$resultSet['data']より取得している

fx_new.phpのエラー処理例。エラーメッセージが格納されている$errorsListはグローバル変数。使用する際はFX_Fuzzy_DebuggerまたはDeveloper/FMErrors.phpをインクルードしておくこと

api_new_1.phpにアクセスしてレコードを作成。フィールド情報・レコード情報ともにFileMaker_Recordオブジェクトから取得している。レコード情報以外にもフィールドやレイアウト情報のほとんどが各オブジェクトに格納されているので、凝った機能を作成しやすい

api_new_1.phpのエラー処理例。エラーコードとメッセージはそれぞれgetCode(), getMessage()で取得している

api_new_2.phpにアクセスしてレコードを作成。PHP側でレコードオブジェクトを作成・commitした場合は結果は返らない。エラー処理も結果も必要ない場合はこの方法でレコードを作成するのも一つの手

FX.phpでは結果が配列で返る分、加工がしやすい。APIと比較すると機能がすくないので、そこはクラスや関数を自作する必要がある。APIは機能も豊富で取得できる情報も多いが、結果が独自のオブジェクトで返る分、FX.phpと比較すると加工がしにくいと言えるだろう。APIは使用する前に、マニュアルやソースコードを熟読されたい。