0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FileMakerAdvent Calendar 2016

Day 10

FX.php を初めて触る人のために

Last updated at Posted at 2016-12-09

FX.php の現状

現時点でFX.phpの最新版はGitHubに公開されています。一時期はウェブ上で検索しても見当たらない(ページが消失)か、バージョンが極端に古いかのときがあったのですが、GitHubにコミットされていて安心しました。

初めての FX.php

さて、それでは FX.php を用いて XML 経由で FileMaker Server のデータを操作していきます。CRUD のいずれも可能ですが、ここでは基礎となる R(Read)のみを見ていきます。

下準備

12/7(水)の記事にあるとおりの FX.php のインストールは済んでいるものとします。あとはこれをrequireしてあげればいいです。

fxphp_first_trial.php
<?php
require_once("./fxphp/FX.php"); # fxphp/ に展開した場合

FX クラスのインスタンス(クエリ)を作る

FX.php も FileMaker API for PHP と同じような感じで検索ができます。まずは FX クラスから$queryというインスタンスを作成しましょう。その際、必須の引数が二つあり、第一引数として FileMaker Server のアドレス、第二引数としてポート番号を取ります。

FileMaker Server のアドレスとポート番号

fxphp_first_trial.php
$query = new FX("FileMaker Server のアドレス", 80);

ユーザー名とパスワード

あとは$queryの必要なメソッドをどんどん実行していきます。まずはユーザー名とパスワードです。

fxphp_first_trial.php
$query->SetDBUserPass("ユーザー名", "パスワード");

データベース名とレイアウト名

次にデータベース名とレイアウト名です。

fxphp_first_trial.php
$query->SetDBData("データベース名", "レイアウト名");

検索条件

そして検索条件です。第一引数にフィールド名、第二引数に検索条件を入力します。第二引数に取る検索条件の指定方法は FileMaker でのそれと同じ書式になります。

fxphp_first_trial.php
$query->AddDBParam("フィールド名", "==apple");

検索を実行する

あとはFMFind()メソッドを実行すれば検索完了です。

fxphp_first_trial.php
$query->FMFind();

検索結果について(生の XML)

FX.php は XML の Web 公開機能を用いているため、内部的には XML でデータが返ってきています。こんな感じですね。

fm_Qiita_20.png

検索結果について(FX.php の返り値)

FX.php では上記の結果を配列に格納しています。詳しくはvar_dump()で見てほしいのですが、["data"]以下に検索にヒットした分だけのレコードが並んでいます。ただ、そのレコードの添字(キー)が例えば["426639.218"]のような形になっています(以下参照)。

array(9) {
  ["data"]=>
  array(1) {
    ["426639.218"]=>
    array(11) {
      ["hogehoge"]=>
      array(1) {
        [0]=>
        string(17) "fugafuga"
      }
      ["FOOBAR"]=>
      array(1) {
        [0]=>
        string(0) ""

この数値は、前述した 生XML の<ROW MODID="218" RECORDID="426639">の部分を、RECORDID.MODIDというように連結した値になります。

このキーを事前に予想することは不可能であり、このキーの配列が["data"]["426639.218"]という上部の階層に来ていることから、検索結果のレコードを取り出すにはforeachを使うのが一般的ということになります。

レコードIDだけを取得するために

FX.php を用いて手動で(?)レコードIDを取得するためには、一意にヒットする検索を行い、以下のような処理を行えばいいでしょうか1

$record_id = strtok(array_keys($find_results["data"])[0], ".");

foreachで回すのがやはりよさそうです。

なぜレコードIDがそんなにほしいか

Read はいいのですが、Update や Delete にはレコードIDを使うからです。

具体例

いろいろ余談的なことも書いてきましたが、具体例で考えましょう。。

以下のようにStaffというデータベースのStaffDataレイアウト内のstaff_dataというテーブルを用います2

fm_Qiita_02.png

fm_Qiita_03.png

以下の5つのカラムが定義されているのが分かります。

  • id
  • name
  • gender
  • work
  • point

このテーブルに対して 7 つのデータが投入されています。

コードを書く

これまでに書いた内容をまとめて、以下のような検索条件で検索をしてみましょう。

genderfemaleであるレコード

以下がコードになります。

find_record_for_gender_female_fxphp.php
<?php
require_once("./fxphp/FX.php"); # fxphp/ に展開した場合

$query = new FX("FileMaker Server のアドレス", 80);
$query->SetDBUserPass("ユーザー名", "パスワード");
$query->SetDBData("Staff", "StaffData");
$query->AddDBParam("gender", "==female");
$result_records = $query->FMFind();

# 検索結果の表示
echo count($result_records["data"]) . " 件ヒットしました!" . "\n\n";
echo "ヒットした方のお名前は以下のとおりです" . "\n";
foreach ($result_records["data"] as $result_record) {
    echo $result_record["name"] . "\n";
}
結果
3 件ヒットしました!

ヒットした方のお名前は以下のとおりです
higashino
ishikawa
kawano

エラーコード

エラーコードは上記での$queryに対して以下のようにして取得できます。エラーコード一覧はこちらに詳しくまとまっています。

echo $query->fxError

他に、デバッグ方法として、FX_Fuzzy_Debugger(DEBUG_FUZZY)というものを使う方法もあります。

結論

返り値の配列の構造に注意すれば、手続きは FileMaker API for PHP より簡潔に書けるかと思います。アーカイブに同梱のDocumentationに詳しいドキュメントがありますので参考にするといいでしょう。FX.php のコード内にも少し設定できる箇所がありますので、さらに興味があればソースを読み込んでみるのも面白いかと思います。

  1. どう見ても無理矢理過ぎる

  2. いろいろ問題がある設計ですが、あくまでサンプルとして分かりやすさを重視しています

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?