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でレコードを登録、結果を取得するまでの手順
- new FXでインスタンスを作成、接続先を指定
- AddDBParamでフィールドに登録したい内容を指定
- FMNewまたはDoFXAction('new')でリクエスト発行
- 結果を配列で取得
- $resultSet['errorCode']の値でエラー判定
- $resultSet['data']からフィールド内容を取得
APIでレコードを登録、結果を取得するまでの手順
- new FileMakerでFileMakerのインスタンスを作成、接続先を指定
- newAddCommandでFileMaker_Command_Addオブジェクトを作成
- setField, setFieldFromTimestampでフィールドに登録したい内容を指定
- executeでリクエスト発行
- 成功した場合はFileMaker_Resultオブジェクトが、失敗した場合はFileMaker_Errorオブジェクトが返る
- FileMaker::isErrorでエラー判定
- getFirstRecordやgetRecordsでFileMaker_Recordオブジェクトを取得
- getFieldやgetFieldUnencodedでフィールド内容を取得
APIでレコードを登録 (結果を取得しないパターン)
- new FileMakerでFileMakerのインスタンスを作成、接続先を指定
- createRecordでレコードオブジェクトを作成
- setField, setFieldFromTimestampでフィールドに登録したい内容を指定
- commitでリクエスト発行
- 成功した場合はtrueが、失敗した場合はFileMaker_Errorオブジェクトが返る
- 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]) . ' </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)) . ' </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のエラー処理例。エラーメッセージが格納されている$errorsListはグローバル変数。使用する際はFX_Fuzzy_DebuggerまたはDeveloper/FMErrors.phpをインクルードしておくこと |
api_new_1.phpにアクセスしてレコードを作成。フィールド情報・レコード情報ともにFileMaker_Recordオブジェクトから取得している。レコード情報以外にもフィールドやレイアウト情報のほとんどが各オブジェクトに格納されているので、凝った機能を作成しやすい |
api_new_2.phpにアクセスしてレコードを作成。PHP側でレコードオブジェクトを作成・commitした場合は結果は返らない。エラー処理も結果も必要ない場合はこの方法でレコードを作成するのも一つの手 |
FX.phpでは結果が配列で返る分、加工がしやすい。APIと比較すると機能がすくないので、そこはクラスや関数を自作する必要がある。APIは機能も豊富で取得できる情報も多いが、結果が独自のオブジェクトで返る分、FX.phpと比較すると加工がしにくいと言えるだろう。APIは使用する前に、マニュアルやソースコードを熟読されたい。