本連載では前回からFileMaker API for PHPをテーマに解説している。まずは手始めに、FileMaker API for PHPを使用してFileMakerデータベースへの接続と、指定したテーブルへアクセスしレコードを取得する方法を2回にわたり紹介する。
今回はデータベースへの接続手順だ。FX.phpでの実装例を長期に渡って紹介した経緯があるため、今後FileMaker API for PHPを紹介するときは可能なかぎりFX.phpと機能の差異やパフォーマンスなどを比較しながら進めていこう。
API for PHPでのDB接続手順
まずはデータベースへ接続してレコードの情報を取得するところからはじめてみよう。はじめにFileMakerデータベースを用意する。ここで使用するFileMakerファイルの各種情報は次のとおり。
- ファイル名: fmapi_test.fp7
- アクティブアカウント/パスワード: admin / admin
- テーブル名: fmapi_table
- レイアウト名: fmapi_list
- フィールド定義: 添付画像を参照
- 拡張アクセス権: fmxml, fmphp
テーブル「fmapi_table」のフィールド定義。今回は簡単な操作しかおこなわないので、必要最低限のフィールドのみを用意した |
レイアウト「fmapi_list」。作成した3フィールドを配置したのみで、目立った設定はおこなっていない |
FileMaker API for PHPでデータベースに接続するまでの手順はおもに次のとおりだ。
- FileMaker API for PHP (FileMaker.php)をロード
- FileMaker データベースクラスのインスタンスを変数に割りあて
- あたらしいFileMakerインスタンスのキープロパティを設定
実際にFileMaker API for PHPを使用してコードを記述する。
fmapi_test.php
<?php
include_once('./FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$findCommand = $data->newFindAllCommand('fmapi_list');
$result = $findCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
}
else
{
// 正常処理..
}
?>
このコードではデータベース「fmapi_test.fp7」に接続し、レイアウト「fmapi_list」に表示されているレコードを全件取得している。行ごとにどのような処理をおこなっているかを解説していこう。
fmapi_test.php 3行目
include_once('./FileMaker.php');
FileMaker API for PHPをロードする。必要に応じて、このあとに続けて、データベース情報やホスト情報を格納したPHPファイルを読み込むようにしておくのも良いだろう。
fmapi_test.php 5行目
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
FileMakerデータベースオブジェクトのインスタンスを作成すると同時に、データベースへ接続するための情報を指定している。
FileMakerコンストラクタ (FileMaker.php 121-136行目より)
/**
* FileMaker object constructor. If you want to use the constructor
* without having to specify all the parameters, pass in null for
* the parameters you would like to omit.
*
* For example: To only specify the database name, username, and
* password, but omit the hostspec, call the constructor as,
*
* new FileMaker('DatabaseName', null, 'username', 'password');
*
* @param string $database The name of the database to use
* @param string $hostspec Hostspec to use
* @param string $username Username to login into database as
* @param string $password Password for username
*/
function FileMaker($database = NULL, $hostspec = NULL, $username = NULL, $password = NULL)
- $database: FileMakerファイル名を指定。拡張子(.fp7)はつけてもつけなくてもどちらでも良い
- $hostspec: ホスト情報をポート番号付きで指定
- $username: 指定したFileMakerファイルをひらくためのアカウント名
- $password: 指定したFileMakerファイルをひらくためのパスワード
デフォルト引数が設定されているため、これらは省略が可能。省略する場合はインスタンス作成後、setPropertyメソッドで各種情報を設定する。
setPropertyメソッド (FileMaker.php 141-147行より)
/**
* Set $prop to a new value for all API calls.
*
* @param string $prop The name of the property
* @param string $value Its new value.
*/
function setProperty($prop, $value)
- $prop: 設定したいプロパティ名を指定
-
$value: プロパティに格納したい値を指定
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
は
$data = new FileMaker();
$data->setProperty('database', 'fmapi_test');
$data->setProperty('hostspec', 'http://localhost:80');
$data->setProperty('username', 'admin');
$data->setProperty('password', 'admin');
と同義。
fmapi_test.php 7行目
$findCommand = $data->newFindAllCommand('fmapi_list');
$dataの情報をもとにFileMaker_Command_FindAllオブジェクトを生成し、$findCommandに割りあてる。引数にはレコードを全件取得したいレイアウトを指定する。
newFindAllCommandメソッド (FileMaker.php 295-302行目より)
/**
* Create a new FileMaker_Command_FindAll object.
*
* @param string $layout The layout to find all records in.
*
* @return FileMaker_Command_FindAll The new find-all command.
*/
function &newFindAllCommand($layout)
- $layout: レイアウト名を指定
fmapi_test.php 9行目
$result = $findCommand->execute();
$findCommandの情報をもとに検索を実行し、その結果を$resultに格納する。ここではじめてFileMaker Serverへのアクセスが発生する。正常処理時にはFileMaker_Resultオブジェクト、エラー発生時にはFileMaker_Errorオブジェクトが割りあてられる。
fmapi_test.php 11行目
if (FileMaker::isError($result))
FileMaker APIエラーが発生していないかをチェックしている。エラーが発生している場合はtrue、それ意外はfalseが返る。
is_a($result, 'FileMaker_Error');
と同義。
エラー処理後、正常処理ならばforeachやgetFieldなどを駆使してレコード値を取得していくことになる。追って次回紹介していこう。なお、ここまでをFX.phpで実装すると次のようなコードになる。
fmfx_test.php
<?php
include_once('../fx/FX.php');
$data = new FX('localhost', 80, 'FMPro9', 'http');
$data->SetDBData('fmapi_test','fmapi_list');
$data->SetDBUserPass('admin','admin');
$result = $data->FMFindAll();
if ( '0' === (string)$resut['errorCode'])
{
// 正常処理..
}
else
{
// エラー処理..
}
?>
FileMaker API for PHP、FX.phpどちらかしか使ったことのないデベロッパは、これらを比較して感覚をつかんでみてほしい。これを機にぜひ両ライブラリを使えるようになっておこう。