2
2

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 3 years have passed since last update.

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

Last updated at Posted at 2020-07-19

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
    include_once('./lib/FileMaker.php');
    $fm = new FileMaker();
    echo '<pre>';
    var_dump($fm->listDatabases());
    echo '</pre>'
?>

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


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

<?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からは、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から、FileMaker Serverでホストされているデータベースにアクセスし、任意のレコード情報を取り出しができるようになった訳だ。

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

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

FileMaker には、Data APIがあるんじゃ・・・

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

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?