FileMaker for PHP 開発備忘録

 

FileMakerデータベースへ接続

【使用する主な関数】
FileMaker(データベース名,ホスト名,アカウント名,パスワード) … FileMakerデータベースへ接続する

【使用方法や注意点等】
データベース名はfmp12ファイルのファイル名。拡張子「.fmp12」は不要。
ホスト名はホストしてるサーバーのIPアドレスやドメイン。
アカウントはデータベースのセキュリティの管理で設定した「fmphp」が有効なもの。
これらの接続情報は他人が見れないようにiniファイルに格納しておくべきである。parse_ini_file(iniファイルのパス)でiniファイルの変数を連想配列に格納する。
接続に失敗する可能性を考慮する。exit()で処理を停止できる。

【サンプル】

■sample.ini
database = sample_database;
hostspec = xxx.com;
username = php;
password = 9999;
■sample.php
$ini = parse_ini_file('sample.ini');
$database = $ini['database'];
$hostspec = $ini['hostspec'];
$username = $ini['username'];
$password = $ini['password'];
$fm = new FileMaker($database, $hostspec, $username, $password);
if(FileMaker::isError($fm)) {
	echo 'database access error.';
	exit();
}
else {
}

 

FileMakerスクリプトの実行

【使用する主な関数】
newPerformScriptCommand(レイアウト名,スクリプト名,引数[省略可]) … FileMakerスクリプトを設定する
execute() … 実行する

【使用方法や注意点等】
FileMaker Pro , FileMaker Go , FileMaker WebDirect における「サーバー上のスクリプトを実行」ステップと同じと考えればいい。
第1引数がレイアウト名となってるが、これはFileMaker Server がFileMakerスクリプトの実行を開始するときのレイアウトを指定する。
引数を送ることはできるが返り値を受け取ることはできない。これができたら便利なんだが。

【サンプル】

$script =& $fm->newPerformScriptCommand('商品一覧', '商品_集計', 1001);
$result = $script->execute();
if(FileMaker::isError($result)) {
	// エラーが発生した場合の処理
}
else {
	// 処理
}

 

レコードの処理

【使用する主な関数】
getFetchCount() … 対象レコード数を取得する
getRecords() … 対象レコードを取得する
getFirstRecord() … 最初のレコードを取得する
getRecordId() … レコードIDを取得する
getField(フィールド名,繰り返し番号[省略可]) … フィールド値を取得する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。
配列の各要素をループで処理するにはforeach()が使いやすい。

【サンプル】

$find = $fm->newFindAllCommand('商品一覧');
$result = $find->execute();
if(FileMaker::isError($result)) {
	$shouhin_qty = 0;
}
else {
	$shouhin_qty = $result->getFetchCount();
	$shouhin_records = $result->getRecords();
	$i = 1;
	foreach($shouhin_records as $shouhin_record) {
		$shouhin_recordno[$i] = $i;
		$shouhin_recordid[$i] = $shouhin_record->getRecordId();
		$shouhin_code[$i] = $shouhin_record->getField('商品コード');
		$shouhin_name[$i] = $shouhin_record->getField('商品名');
		$i = $i + 1;
	}
}

 

レコードの検索

【使用する主な関数】
newFindRequest(レイアウト名) … 検索レコードのレイアウトを指定する
addFindCriterion(フィールド名,値) … 検索フィールドを追加する
newCompoundFindCommand(レイアウト名) … 検索を実行するレイアウトを指定する
add(順位,検索レコード) … 検索レコードを追加する
execute() … 実行する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。
FileMakerの検索モードと同じだと考えればいい。「*」や「=」等の演算子もFileMakerと同様に使用できる。
AND検索は同一レコードに指定する。検索フィールド1と検索フィールド2を検索レコードに追加する。
OR検索はレコードを増やして指定する。検索レコード1と検索レコード2を検索実行条件に追加する。
ソートは検索実行の前に検索実行条件に追加する。優先順位は整数を指定する。値が小さいほど優先順位が大きい。ソート順は、昇順なら「FILEMAKER_SORT_ASCEND」、降順なら「FILEMAKER_SORT_DESCEND」、値一覧なら値一覧名を指定する。

【サンプル】

$find1 = $fm->newFindRequest('商品一覧');
$find1->addFindCriterion('有効フラグ', '1');
$find1->addFindCriterion('在庫数', '>0');
$find2 = $fm->newFindRequest('商品一覧');
$find2->addFindCriterion('有効フラグ', '1');
$find2->addFindCriterion('発売日', '2019/04/01...');
$find = $fm->newCompoundFindCommand('商品一覧');
$find->add(1, $find1);
$find->add(2, $find2);
$find->addSortRule('商品コード', 1, FILEMAKER_SORT_ASCEND);
$result = $find->execute();
if(FileMaker::isError($result)) {
	// エラー(検索結果が0件等)が発生した場合の処理
}
else {
	// 処理
}

 

レコードの作成

【使用する主な関数】
newAddCommand(レイアウト名) … 作成を実行するレイアウトを指定する
setField(フィールド名,値,繰り返し番号[省略可]) … フィールド値を設定する
execute() … 実行する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。

【サンプル】

$add = $fm->newAddCommand('商品一覧');
$add->setField('商品コード', '1001');
$add->setField('商品名', 'ペン');
$result = $add->execute();
if(FileMaker::isError($result)) {
	// エラーが発生した場合の処理
}
else {
	// 処理
}

 

レコードの複製

【使用する主な関数】
newDuplicateCommand(レイアウト名,レコードID) … 複製を実行するレイアウトとレコードを指定する
execute() … 実行する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。

【サンプル】

$duplicate = $fm->newDuplicateCommand('商品一覧', 1234);
$result = $duplicate->execute();
if(FileMaker::isError($result)) {
	// エラーが発生した場合の処理
}
else {
	// 処理
}

 

レコードの編集

【使用する主な関数】
newEditCommand(レイアウト名,レコードID) … 編集を実行するレイアウトとレコードを指定する
setField(フィールド名,値,繰り返し番号[省略可]) … フィールド値を設定する
execute() … 実行する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。

【サンプル】

$edit = $fm->newEditCommand('商品一覧', 1234);
$edit->setField('商品名', 'ボールペン');
$result = $edit->execute();
if(FileMaker::isError($result)) {
	// エラーが発生した場合の処理
}
else {
	// 処理
}

 

レコードの削除

【使用する主な関数】
newDeleteCommand(レイアウト名,レコードID) … 削除を実行するレイアウトとレコードを指定する
execute() … 実行する

【使用方法や注意点等】
処理はテーブルではなくレイアウトに依存する。

【サンプル】

$delete = $fm->newDeleteCommand('商品一覧', 1234);
$result = $delete->execute();
if(FileMaker::isError($result)) {
	// エラーが発生した場合の処理
}
else {
	// 処理
}

 

関連フィールドについて

フィールド名を該当のレイアウトから見たときの完全修飾名にする。
setField(テーブルオカレンス名::フィールド名,値,繰り返し番号[省略可])
getField(テーブルオカレンス名::フィールド名,値,繰り返し番号[省略可])

【使用方法や注意点等】
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。

 

繰り返しフィールドについて

第3引数で繰り返し番号を指定できる。
setField(フィールド名,値,繰り返し番号)
getField(フィールド名,値,繰り返し番号)

【使用方法や注意点等】
使用するフィールドは該当のレイアウトに配置されてる必要がある。表形式でのみ表示では不可。
FileMakerのレイアウトモードの インスペクタ>データ>繰り返しを表示 を使って1つのオブジェクトで必要な繰り返し範囲を表示する。バラバラに配置では不可。
FileMakerの繰り返し番号は1から始まるが、PHPの繰り返し番号は0から始まる。そのためFileMakerの繰り返し番号から1を引いた値を指定する。
そもそも繰り返しフィールドというのはFileMaker特有の概念である。INTER-Mediatorというフレームワークはこれに対応してないので利用する場合は注意。

 

グローバルフィールドについて

FileMaker Server でホストしてるデータベースのグローバルフィールドは、FileMaker Pro , FileMaker Go , FileMaker WebDirect のクライアントではセッションごとに値を持つが、FileMaker for PHP , FileMaker for XML では処理がサーバーサイドのためそうはならない。

■PHPのセッション変数の使用
ユーザーに依存し、データベースにも他のユーザーにも影響を与えない。
セッション変数を使用するには最初にsession_start()を一度実行する。
ブラウザを終了するとセッション変数は自動で削除される。
$_SESSION[変数名]

$_SESSION['user_id'] = '1';

■グローバルフィールドを含むリレーションの代替策
リレーションを使用せずリレーション先のテーブルでレコードの検索をする。
ループの中で検索等をすると処理時間が長くなってしまう場合がある。PHPの配列操作関数等を駆使してアルゴリズムを工夫するといい。
array_key_exists(値,配列) … 値が配列にあるか調べる (返り値: true or false)
array_search(値,配列) … 値を配列から検索する (返り値: 対応する最初のキー or false)
array_unique(配列) … 配列から値が重複してる要素を削除する
sort(配列) … 配列の値をソートする
etc.

 

 

投稿者プロフィール

菅田大器
スモールの未来探究部 所属
FileMaker開発エンジニア