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開発エンジニア