FileMakerに保存されているレコード情報を他のシステムから参照したい

# FileMaker Serverをインストールすると、FileMaker.phpが使えるようになるので、ホストしているデータベースをJSONで他のシステムから参照できるようにしてみる。

---
### FileMaker.phpのインストール

FileMaker Server 17をmacOSにインストールすると、macOS標準のものとは別に、Apacheが稼働するように構成されているようだ。

HTTP Root

```
/Library/FileMaker Server/HTTPServer/htdocs/
```

HTTPS Root

```
/Library/FileMaker Server/HTTPServer/htdocs/httpsRoot/
```

という感じになっている。
※18や19でどうなっているかは不明

```
/Library/FileMaker Server/Web Publishing/FM_API_for_PHP_Standalone.zip
```
があるので、そちらをhttpsRoot/lib/に展開しておく。

```php
<?php
    include_once('./lib/FileMaker.php');
    $fm = new FileMaker();
    echo '<pre>';
    var_dump($fm->listDatabases());
    echo '</pre>'
?>
```

httpsRoot/database.phpに保存して、ブラウザからアクセス・・・データベースのリストが表示されたらOKだ。

---
### 任意のテーブル、任意のレイアウトで、IDを指定してJSONを取得できるようにする。


```php
<?php
	include_once('../lib/FileMaker.php');
	$fm = new FileMaker('[DATABASE NAME]', '[HOST NAME]', '[USER NAME]', '[PASSWORD]');

	$s = '';
	$id = $_GET["id"];				//ID指定
	$db = $_GET["table"];			//データベース：テーブル名
	$ly = $_GET["layout"];			//レイアウト名

	if($id > 0)
	{
		$findCommand = $fm->newFindCommand($db);	//検索処理コマンドのインスタンス生成
		$findCommand->addFindCriterion("id", "==".$id);	//検索条件を追加
		$result = $findCommand->execute();			//検索実行
		$layoutObj = $fm->getLayout($ly);			//レイアウトを取得
	
		if (FileMaker::isError($result))
		{
			// エラー処理
			if(ctype_digit($id))
				$s .= '"id":' . $id . ',';
			else
				$s .= '"id":"' . $id . '",';
			$s .= '"table":"' . $db . '",';
			$s .= '"layout":"' .$ly. '",';
			$s .= '"FileMaker Error Code":' . $result->getCode(). ",";
			$s .= '"FileMaker Error Message":"' . $result->getMessage() . '"';
		}
		else
		{
			// 正常処理
			$fields = $layoutObj->listFields();	//レイアウト上に配置されている全てのフィールド取得
			$records = $result->getRecords();	//検索条件でのレコードを取得
			foreach ($records as $record)		//今回は1レコードをIDキー指定で取得する前提なので。
			{
				foreach ( $fields as $f ){
					if($s!=='') $s .= ',';
					$s .= '"'.$f.'":';
					$val= $record->getField($f);
					if(ctype_digit($val)){
						if(strlen($val)>1 && substr($val, 0, 1)==='0'){
							$val = '"'.$val.'"';
						}	
					} else {
						$val = '"'.$val.'"';
					}
					//$s .= ctype_digit($record->getField($f)) ? $record->getField($f) : '"'.$record->getField($f).'"';
					$s .= $val;
				}
			}
		}	
	}
	echo '{'.$s.'}';
?>
```

json.php に上記のコードを保存して、アクセスできるようにする。

```
https://[HOSTNAME]/[DATABASENAME]/json.php?ID=1234
```

てな具合にアクセスするとJSON文字列を取得できるので、


[4D](https://jp.4d.com/product-download/Feature-Release)からは、HTTP Getコマンドを使用して、

```
C_BLOB($b)    // バイナリデータ変数
C_OBJECT($obj)    // オブジェクト変数
$url:="https://[HOSTNAME]/[DATABASENAME]/json.php?id="+String($id)+"&table=[TABLENAME]&layout=[LAYOUTNAME]"
$stat:=HTTP Get($url;$b)    // URLにアクセスしてバイナリデータとして取得
If ($stat=200)
	$s:=BLOB to text($b;UTF8 text without length) //バイナリデータをUTF8としてテキストに変換
	$obj:=JSON Parse($s)  //テキストをJSONである前提でパースしてオブジェクトに変換
	$data:=OB Get($obj;"[FIELDNAME]";Is text) //オブジェクトから特定の値を取り出し
End if 
```

こんな感じのコードで、特定のフィールドの値を取り出すことができるようになる。
[4D](https://jp.4d.com/product-download/Feature-Release)から、FileMaker Serverでホストされているデータベースにアクセスし、任意のレコード情報を取り出しができるようになった訳だ。

もちろん、php側を好きなようにコーディングすれば、条件に合致するレコードをJSON配列としてガッツリ取り出したりする事もできる。

そのためには、FileMaker Serverによるデータベースの共有が欠かせない訳だが簡単な連携ができるようになると、それぞれのプロダクトの得手不得手、特性を生かして効率良く連携できるシステムになったりするのである。

### [FileMaker](https://www.claris.com/filemaker/) には、Data APIがあるんじゃ・・・

FileMaker Serverは標準でJSONによるData APIが存在する。こちらはなんと、従量制で、データ送出量によって課金されるとか・・・良くわからないので放置中