本連載では前回から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を使用する場合はfmphpのみで事足りるが、FX.phpと比較をおこないたいためfmxmlにもチェックをおこなっている

FileMaker API for PHPでデータベースに接続するまでの手順はおもに次のとおりだ。

  1. FileMaker API for PHP (FileMaker.php)をロード
  2. FileMaker データベースクラスのインスタンスを変数に割りあて
  3. あたらしい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どちらかしか使ったことのないデベロッパは、これらを比較して感覚をつかんでみてほしい。これを機にぜひ両ライブラリを使えるようになっておこう。