Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

PHPとFileMaker ProによるWebアプリケーション構築(実装編)

ITエンジニアのためのFileMaker講座 第11回(後編)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/05/07 14:00

 前回はPHPとFileMaker Proを連係させるための前提知識を紹介しました。今回は、APIの使い方と簡単なCMSを構築し動作させるまでの過程を解説し、 具体的にPHPとFileMakerがどのようにデータ連係を行うかについてお伝えしたいと思います。

はじめに

 前回はFileMaker API for PHPの魅力を中心に、FileMaker ServerのインストールとWeb公開設定の準備について説明しました。今回は、APIの使い方と簡単なCMSを構築し動作させるまでの過程を解説し、具体的にPHPとFileMakerがどのようにデータ連係を行うかについてお伝えしたいと思います。

FileMaker API for PHPの準備と主な使い方

 PHPからFileMaker Serverの機能を扱うには、FX.php(CGIリクエストによる利用)とFileMaker API(APIによる利用)の2つの方法があります。本稿では後者(FileMaker.php)を利用について説明します。

データベースのアップロードと動作のための準備

 サンプルデータベース(display.fp7)とサンプルスクリプト(display.php)を使いながら、PHPによるWeb公開の手順を説明します。display.fp7は「display」レイアウトと「Color」と「Size」の2つのフィールドからなる非常にシンプルなデータベースです。

 記事に添付されているサンプルファイル「display.zip」をダウンロードして解凍し、実際に内容を確認しながら以下の説明を読み進めてください。

 サンプルデータは「Red」「Blue」「White」「Black」の4つのColorと、「Small」「Middle」「Large」の3つのSizeの組み合わせで構成されています。

1. アップロードするデータベースファイルのWeb公開設定を行う

 データベースファイルをFileMaker Proで開き、アカウント名とパスワードを設定します。

 アカウント名とパスワードの設定はメニューの[ファイル]-[管理]-[アカウントとアクセス権]で行います。また、PHPからのアクセスを有効にするには、[アクセス権セットの編集]タブで目的のアクセス権セットを選択して[編集]をクリックし、「PHP Web公開でのアクセス - FMSのみ(fmphp)」にチェックを付けておく必要があります。

ここでは「user」アカウントを作成
ここでは「user」アカウントを作成
PHPからのアクセスを有効に
PHPからのアクセスを有効に

 次いで、メニューの[ファイル]-[共有設定]-[FileMakerネットワーク]を選択して「FileMakerネットワークの設定」にある「ネットワーク共有」を「オン」とします。

ネットワーク共有をオンに
ネットワーク共有をオンに

2. サーバーの起動

 次にFileMaker Server Admin Consoleを起動(前稿を参照)して、データベースサーバーとWeb公開を開始します。

3. データベースのアップロード

 下図の上部左から5番目のアイコン(データベースのアップロード)をクリックしてアップロードアシスタントを開始します。

「データベースのアップロード」アイコンをクリック
「データベースのアップロード」アイコンをクリック

 [データベースの追加]ボタンをクリックして、アップロード対象となるデータベースを選択し、[進む]ボタンをクリックします。

データベースの選択
データベースの選択

 次に[アップロード後にデータベースを自動的に開く]をオンにし、[進む]ボタンをクリックします。

[アップロード後にデータベースを自動的に開く]ボタンをオンに
[アップロード後にデータベースを自動的に開く]ボタンをオンに

 正常にアップロードが完了すると「データベースのアップロードの概要」で「状態」欄に緑色の丸いアイコンが表示されます。

アップロードの完了
アップロードの完了

 データベース管理の画面で下図のようにデータベースの「状態」欄が「正常」、「PHP」欄にチェックが入っていれば正常に動作しています。もし「状態」欄が「閉じる」になっていたり「PHP」欄にチェックが入っていない場合は、データベースファイルをFileMaker Proで開いて、先の「アクセス権セットの編集」や「FileMakerネットワークの設定」を見直してください。

動作状況の確認
動作状況の確認

 ApacheやIISを自分でインストールする場合は、FileMaker.phpをはじめとするAPIのファイルを手動で配置する必要があります。ファイル一式は、以下の場所にZIPファイルとしてインストールされています。本稿では動作させるPHPスクリプトと同一階層にZIPファイルを解凍し、フォルダ名を「API」に変更した状態で設置したものとして話を進めます。

├ ※ PHPスクリプト
└ API/
    ├ FileMaker.php
    └ FileMaker/
        └ ※ 以下API用ファイル一式

 APIファイルは次の場所にあります。

Macの場合(FileMaker Serverを MacHD/ライブラリ 以下にインストール)
MacHD/ライブラリ/FileMaker Server/Web Publishing/FM_API_for_PHP_Standalone.zip
Windowsの場合(FileMaker Serverを C:\Program Files 以下にインストール)
C:\Program Files\FileMaker\FileMaker Server\Web Publishing\FM_API_for_PHP_Standalone.zip

FileMakerデータベースとの接続

 データベースファイルが無事アップロードできたところで、実際にFileMaker API for PHPの使い方について説明を進めます。

 FileMaker API for PHP(FileMaker.php)を使うには、まずFileMakerというメインクラスのインスタンスを作成します。その後レコードの追加や検索などの目的に応じてレコード追加用のクラス、検索用クラスを使います。

 以降、接続方法から順にPHPソースコードの記述方法について説明します。

1. FileMaker API for PHPを読み込む

 まず「FileMaker.php」を読み込みます。

require_once ('./API/FileMaker.php');

2. FileMakerというメインクラスのインスタンスを作成します

 次にFileMakerクラスのインスタンスを$dbに割り当てます

$db = new FileMaker();

3. FileMakerのデータベースに接続します

 最後にFileMakerデータベースに接続します。例えば、「display.fp7」ファイルに、アカウント名「user」、パスワード「pass」で接続する場合は次のように記述します。

$db -> setProperty('database', 'display');
$db -> setProperty('username', 'user');
$db -> setProperty('password', 'pass');

 なお、ファイル名「display.fp7」の拡張子「.fp7」は省略することになっているので気をつけてください。

レコードを追加する

 データベースに接続できたところで、よくあるレコードやフィールドの操作について順番に説明します。まず、新しいレコードの追加について説明をします。

 新しいレコードを追加するにはnewAddCommandクラスを使います。

$addCommand = $db -> newAddCommand("display");

 この一行でレイアウト名「display」に対して FileMaker_Command_Addオブジェクトが作成(レコード追加)されます。これにより displayレイアウトにレコードを追加するというインスタンスが生成されます。

 レコードの各フィールドに値を代入するには、setFieldクラスを使います。新規作成したレコードのColorフィールドに「Gold」、Sizeフィールドに「Middle」を追加する例を示します。

$addCommand -> setField('Color', "Gold");
$addCommand -> setField('Size', "Middle");

 executeクラスで、先の「新規レコードを追加」と「ColorフィールドにGold、SizeフィールドにMiddleを代入」の命令を実行します。

$result = $addCommand -> execute();
レコード追加のサンプルソース(display_add.php)
<?php
/* 初期設定 */
$database = 'display';
$username = 'user';
$password = 'password';

/* FileMaker.phpの読み込み */
require_once('./API/FileMaker.php');

/* FileMakerインスタンスを作成 */
$db = new FileMaker();

/* データベースへの接続 */
$db -> setProperty('database', $database); 
$db -> setProperty('username', $username); 
$db -> setProperty('password', $password);

/* レコードにデータを追加 */
$addCommand = $db->newAddCommand("display");
$addCommand -> setField('Color', "Gold");
$addCommand -> setField('Size', "Middle");
$result = $addCommand -> execute();
?>

レコードを検索する

 レコードを検索するには、newFindCommandクラスを使います。

$findCommand = $db -> newFindCommand("display");

 newFindCommandクラスにdisplayというレイアウト名を渡します。これによりdisplayレイアウトで検索するためのインスタンスが生成されます。

 ここではColorフィールドにYellow、SizeフィールドにLargeを含むレコードを検索する例を紹介します。

$findCommand -> addFindCriterion('Color', '==' . "Yellow");
$findCommand -> addFindCriterion('Size', '==' . "Large");

 検索条件を追加するにはaddFindCriterionクラスを使います。addFindCriterionクラスには「フィールド名」と「値」を与えます。ちなみに「値」の先頭にはFileMakerの検索用演算子( == は「フィールド全体が一致」を意味する)を用います。

 executeクラスで検索を実行します。

$result  = $findCommand -> execute();

 先のレコードに追加する場合と異なり、このままでは検索を実行しても、FileMaker Proのアプリケーション上で実行していないので結果は確認できません。そこで、以下のようにPHPで返された結果を表示します。

if(!FileMaker::isError($result)){
    $records = $result->getRecords();

    foreach($records as $record){
        echo $record -> getField('Color') . " and " . $record -> getField('Size') . '<br />';
    }
}

 !FileMaker::isError($result)は結果が存在すればという意味です。getRecordsで返された結果を配列$recordsに追加します。

 foreach($records as $record)では配列を順番に処理します。getFieldクラスでフィールドに対する値を返します。

レコード検索のサンプルソース(display_search.php)
<?php
/* 初期設定 */
$database = 'display';
$username = 'user';
$password = 'password';

/* FileMaker.phpの読み込み */
require_once('./API/FileMaker.php');

/* FileMakerインスタンスを作成 */
$db = new FileMaker();

/* データベースへの接続 */
$db -> setProperty('database', $database); 
$db -> setProperty('username', $username); 
$db -> setProperty('password', $password);

/* レコードの検索 */
$findCommand = $db -> newFindCommand("display");
$findCommand -> addFindCriterion('Color', '==' . "yellow");
$findCommand -> addFindCriterion('Size', '==' . "Large");
$result  = $findCommand -> execute();

if(!FileMaker::isError($result)){
    $records = $result->getRecords();

    foreach($records as $record){
        echo $record -> getField('Color') . " and " . $record -> getField('Size') . '<br />';
    }
}
?>

レコードを削除する

 レコードを削除するには、 newFindCommandクラスで対象レコードを絞り込んでから削除します。まず、先ほどのレコードの検索同様、newFindCommandを使って削除対象のレイアウトを指定します。

$deleteCommand = $db -> newFindCommand("display");

 検索キーとしてColorフィールドにYellowを追加して検索を実行します。このとき「==(フィールド全体が一致)」を条件として与えます。

$deleteCommand -> addFindCriterion('Color', '==' . "Yellow");
$result = $deleteCommand->execute();

 絞り込みが完了したところで、対象レコードに対してdeleteクラスを使ってレコードの削除を実行します。本稿では割愛しますが、対象レコードを絞り込んで削除するという手順を応用すると「フィールド内容の置換」もできます。

if(!Filemaker::isError($result)){
    $records =  $result->getRecords();
    foreach($records as $record){
        $result2  = $record -> delete();
    }
}
レコード削除のサンプルソース(display_delete.php)
<?php
/* 初期設定 */
$database = 'display';
$username = 'user';
$password = 'password';
$layout = 'display';

/* FileMaker.phpの読み込み */
require_once('./API/FileMaker.php');

/* FileMakerインスタンスを作成 */
$db = new FileMaker();

/* データベースへの接続 */
$db -> setProperty('database', $database); 
$db -> setProperty('username', $username); 
$db -> setProperty('password', $password);

/* レコードの削除 */
$deleteCommand = $db -> newFindCommand("display");
$deleteCommand -> addFindCriterion('Color', '==' . "Yellow");
$result = $deleteCommand->execute();

if(!Filemaker::isError($result)){
    $records =  $result->getRecords();
    foreach($records as $record){
        $result2  = $record -> delete();
    }
}
?>

 以上、駆け足で追加・検索・削除の方法を説明しましたが、この組み合わせがよく使われ、大半をカバーできます。ぜひマスターしてください。

簡易CMSの作成

 それでは、先の説明に基づいて簡単なCMSを作ってみましょう。

 このサンプルは「日記」「ご案内」「お客様の声」というカテゴリごとにそれぞれタイトルと記事を登録・削除でき、画面左のサイドナビをクリックすると該当するカテゴリの記事が絞り込まれて表示される仕組みです。

CMSの完成イメージ
CMSの完成イメージ

準備編

 まずは、FileMakerのデータと、PHPのラフデザインを用意します。詳細はサンプルソース(samplecms.zip)をダウンロードして確認してください。

FileMakerのデータ
FileMakerのデータ
PHPのラフデザイン
PHPのラフデザイン

 FileMakerおよびPHPスクリプトでは説明の都合上、XSSなどのセキュリティ対策は割愛していますので、このサンプルをカスタマイズして一般公開する場合は、その点を十分配慮してご利用ください。

 登録されているデータは以下の通りです

日付, タイトル, カテゴリ, コメント, シリアル番号

 GET形式で受け取るパラメータ「c」を使い「カテゴリの絞り込み」を行います。例えば「samplecms.php?c=日記」とすると日記カテゴリを絞り込んだ値だけが表示されます。

 GET形式で受け取るパラメータ「action」の値「delete」と「serial」の値で「データの削除」を行います。「action」の値が「delete」ならば削除処理を開始します。「serial」の値はFilemakerのserialフィールドの値のことで、削除対象のデータを表します。例えば、「samplecms.php?action=delete&serial=1」とするとserialフィールドが「1」のレコードを削除します。

 POST形式で受け取るパラメータ「category」「title」「comment」と、「action」の値「regist」の組み合わせで記事を登録します。

記事の登録画面
記事の登録画面

簡易CMSの解説

 簡易CMSのPHP処理について説明をします。samplecms.phpファイルのサンプルソースコード各行番号を示しますので、以下の説明と併せて確認してください。

初期設定

 まず、FileMaker API for PHPを読み込み、FileMakerメインクラスのインスタンスを作成します。

 次いでFileMakerのデータベースへ接続を行います(2行目から7行目)。

require_once ('./API/FileMaker.php');

$db = new FileMaker();
$db -> setProperty('database', 'samplecms');
$db -> setProperty('username', 'user');
$db -> setProperty('password', 'password');

記事データの取得・表示

 説明の都合上スクリプト行番号が前後しますが、先に記事データの取得・表示の部分から説明を進めます。

 GET形式で受け取るパラメータ「c」の値が送信された場合、データベースから該当するカテゴリを絞り込んで表示をします(86行目、87行目)。

/* 記事データの取得・表示 */
$findCommand = $db -> newFindCommand("samplecms");

 newFindCommandクラスにsamplecmsレイアウト名を渡します。samplecmsレイアウト上で検索するインスタンスを生成します(88行目、89行目)。

if(!empty($get_category)){ $findCommand -> addFindCriterion('category', '==' . $get_category); }
$result = $findCommand -> execute();

 categoryフィールドにGET形式で受け取るパラメータ「c」の値を設定して検索を実行します(91行目から103行目)。

※HTMLタグは省略します
if(!FileMaker::isError($result)){
$records = $result -> getRecords();
    foreach($records as $record){

        ※表示のHTMLタグ

    }
}

 検索に該当する結果が返された場合のみデータを順番に表示します。

記事の登録処理

 POST形式で受け取るパラメータ「action」に「regist」がある場合、記事登録の処理を行います(19行目から26行目)。

if($post_action == "regist"){
    $addCommand = $db->newAddCommand("samplecms");
    $addCommand -> setField('title', $post_title);
    $addCommand -> setField('category', $post_category);
    $addCommand -> setField('comment', $post_comment);
    $result = $addCommand -> execute();
    header("Location: samplecms.php");  exit;
}

 newAddCommandクラスにsamplecmsレイアウト名を渡します。

 FileMakerでは新規レコードを作成して「title」「category」「comment」をフィールドに登録します。日付フィールド(updateフィールド)は新規レコード作成時に修正日を自動登録するよう設定してあります。

記事の削除

 GET形式で受け取るパラメータ「action」の値が「delete」の場合、記事削除の処理を行います(29行目から39行目)。

if($get_action == "delete"){
    $deleteCommand = $db -> newFindCommand("samplecms");
    $deleteCommand -> addFindCriterion('serial', '==' . $get_serial);
    $result = $deleteCommand->execute();

    if(!Filemaker::isError($result)){
        $records =  $result->getRecords();  $record = $records[0];
        $result2  = $record -> delete();
    }
    header("Location: samplecms.php");  exit;
}

 GET形式で受けた「serial」値で検索を実行して、絞り込んだレコードを削除します。

 以上、FileMakerデータベースのsamplecms.fp7と、上記説明を含めたPHPスクリプト samplecms.php の組み合わせによって、簡単なFileMakerのWeb公開ソリューションができることを説明しました。

まとめ

 本稿ではPHPスクリプトとFileMakerデータベースの連携を中心に解説しました。

 FileMaker Proの編集画面についての解説は省略しましたが、実際に触ってみればエンドユーザーが直感的にデータの管理画面を構築できることをご理解いただけることでしょう。

 応用次第では、様々な業務形態に適用できると思いますので、ぜひ有意義な活用方法を考えてみてください。本稿が、その一助となれば幸いです。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 岡田 匡(オカダ マサシ)

    岐阜県大垣市のソフトピアジャパンと名古屋市に拠点を置く、WebシステムとFileMakerソリューション開発の会社、株式会社ワークスペースの代表取締役。1998年にCGIプログラミングでショッピングカートシステムを初めて開発。2001年にショッピングカートと連携するネット通販の受注管理システムを手掛...

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5