前回はレコード作成を中心に解説した。今回はFX.phpのCRUD(作成・読出・更新・削除)の残りである読出・更新・削除について紹介する。CRUDができれば大概のシステムは構築できる。繰り返しコードを書いてしっかり使い方を覚えよう。

CRUD(作成・読出・更新・削除)をマスターする

FileMakerからレコードを読み出す場合には、FMFind()メソッドかFMFindAny()メソッドを使用する。FMFindAny()はテーブルに格納されているレコードからランダムに1件抽出する。今回は条件指定や一度に複数レコードの取得が可能なFMFind()を用いたサンプルコードを紹介する。

検索処理において使用するFileMakerファイルは、日本郵政グループのWebサイトに公開されている郵便番号データをFileMakerに変換・加工した、以下のものを使用する。

  • ファイル名: KEN_ALL.fp7
  • テーブル名: KEN_ALL
  • レイアウト名: zipList
  • フィールド名: 図1のとおり

作成したファイルのフィールド一覧。フィールド名は日本語でも問題なく動作するが、念のため半角英文字で構成している

レイアウトに配置したフィールド。XMLを使用したWeb公開の場合、指定したレイアウトに配置されているフィールドに対してしか操作は行えない

更新・削除は前回使用したファイル「fxphp_test.fp7」をそのまま使用する。

検索処理

検索処理のソースコードは以下のとおり。

検索処理: ファイル - fm_find.php

<?php

include_once('./fx/FX.php');

// 文字列エスケープ用関数
function h($string)
{
    return htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
}

// 解説用に 1 つのファイルにするため
// server_data.php の中身をこちらに転記しています

// FileMaker Server の IP アドレスを指定
$serverIP = '(サーバIP)';

// ポートを指定
$webCompanionPort = 80;

// データソースタイプを指定
$dataSourceType = 'FMPro9';

// スキーマを指定
$scheme = 'http';

// FileMaker ファイルを開くためのユーザID, パスワードを指定
$webUN = 'admin';
$webPW = 'admin';

$data = new FX($serverIP, $webCompanionPort, $dataSourceType, $scheme);
$data->SetDBData('KEN_ALL','zipList', 10);
$data->SetDBUserPass('admin','admin');
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
$data->AddDBParam('zip', '150*');
$data->AddSortParam('zip', 'ascend');
$dataSet = $data->FMFind();

?>
<table border="1">
    <thead>
        <tr>
            <th>
                郵便番号
            </th>
            <th>
                都道府県名
            </th>
            <th>
                市区町村名
            </th>
            <th>
                町域名
            </th>
        </tr>
    </thead>
    <tbody>
    <?php
    foreach ( $dataSet['data'] as $key => $value )
    {
    ?>
        <tr>
            <td>
                <?php
                echo h($value['zip'][0]);
                ?>
            </td>
            <td>
                <?php
                echo h($value['pref'][0]);
                ?>
                <br>
                <?php
                echo h($value['pref_kana'][0]);
                ?>
            </td>
            <td>
                <?php
                echo h($value['city'][0]);
                ?>
                <br>
                <?php
                echo h($value['city_kana'][0]);
                ?>
            </td>
            <td>
                <?php
                echo h($value['addr'][0]);
                ?>
                <br>
                <?php
                echo h($value['addr_kana'][0]);
                ?>
            </td>
        </tr>
    <?php
    }
    ?>
    </body>
</table>

このソースコードのポイントをまとめると次のようになる。

  1. new FXでFXクラスを生成
  2. SetDBDataで使用するファイル、レイアウト、一度に取得するレコード上限を指定
  3. SetCharacterEncoding, SetDataParamsEncodingでutf8を指定
  4. AddDBParamで検索条件を指定
  5. AddSortParamでソート条件を指定
  6. FMFind()でリクエストを発行
  7. foreachで結果を表示

Webブラウザでの実行結果

適切なSetCharacterEncoding、SetDataParamsEncodingを指定しなかった場合、文字実体参照が返されてしまう。PHP側で文字列を加工・比較する場合、意図しない動作の原因となりやすいので注意しよう

前回のレコード登録ではAddDBParamで格納したいフィールドと内容を指定していたが、今回は検索条件としてフィールドと内容を指定している。またFMFind()ではソート条件を指定することが可能だ。

GETでソート順や検索条件を引数としてわたすユーザインタフェースを作成すれば、あっというまに検索機能つき一覧画面のできあがりだ。画面を交えての解説については、また次回紹介させていただく。

更新処理と削除処理

更新と削除については、レコード登録時とほとんどかわらない。登録と決定的に違うことは、処理実行時にレコードIDの指定が必須となることだ。FileMakerスクリプトなどを併用しないかぎり、基本的に-findで検索した結果に対して-editや-deleteを行うことはできないので注意しよう。

更新処理のソースコードは以下のとおり。

更新処理: ファイル - fm_edit.php

<?php

include_once('./fx/FX.php');

// 解説用に 1 つのファイルにするため
// server_data.php の中身をこちらに転記しています

// FileMaker Server の IP アドレスを指定
$serverIP = '(サーバIP)';

// ポートを指定
$webCompanionPort = 80;

// データソースタイプを指定
$dataSourceType = 'FMPro9';

// スキーマを指定
$scheme = 'http';

// FileMaker ファイルを開くためのユーザID, パスワードを指定
$webUN = 'admin';
$webPW = 'admin';

$data = new FX($serverIP, $webCompanionPort, $dataSourceType, $scheme);
$data->SetDBData('fxphp_test','testLayout');
$data->SetDBUserPass('admin','admin');
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
$data->AddDBParam('t_testText', 'FMEdit()編集処理');
$data->SetRecordID(10);
$data->SetModID(1);
$dataSet = $data->FMEdit();

var_dump($dataSet);

?>

このソースコードでは次のような流れで実装している。

  1. new FXでFXクラスを生成
  2. SetDBDataで使用するファイル、レイアウトを指定
  3. SetCharacterEncoding, SetDataParamsEncodingでutf8を指定
  4. AddDBParamで変更したいフィールドと内容を指定
  5. SetRecordIDで変更したいレコードのレコードIDを指定
  6. FMEdit()でリクエストを発行
  7. var_dumpで結果を表示

Webブラウザでfm_edit.phpにアクセスし、編集処理を実施

実施後のFileMakerファイル。レコードIDが10のレコードが編集されていることが確認できる

削除処理のソースコードは次のとおり。

削除処理: ファイル - fm_delete.php

<?php

include_once('./fx/FX.php');

// 解説用に 1 つのファイルにするため
// server_data.php の中身をこちらに転記しています

// FileMaker Server の IP アドレスを指定
$serverIP = '(サーバIP)';

// ポートを指定
$webCompanionPort = 80;

// データソースタイプを指定
$dataSourceType = 'FMPro9';

// スキーマを指定
$scheme = 'http';

// FileMaker ファイルを開くためのユーザID, パスワードを指定
$webUN = 'admin';
$webPW = 'admin';

$data = new FX($serverIP, $webCompanionPort, $dataSourceType, $scheme);
$data->SetDBData('fxphp_test','testLayout');
$data->SetDBUserPass('admin','admin');
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
$data->SetRecordID(11);
$dataSet = $data->FMDelete();

var_dump($dataSet);

?>

こちらのポイントは次のとおり。

  1. new FXでFXクラスを生成
  2. SetDBDataで使用するファイル、レイアウトを指定
  3. SetCharacterEncoding, SetDataParamsEncodingでutf8を指定
  4. SetRecordIDで削除したいレコードのレコードIDを指定
  5. FMDelete()でリクエストを発行
  6. var_dumpで結果を表示

Webブラウザでfm_delete.phpにアクセスし、削除処理を実施

実施後のFileMakerファイル。レコードIDが11のレコードが削除されていることが確認できる

FMDeleteでは引数をつけない場合、結果の配列を返さずにtrueしか返らないようになっている。たとえFileMaker側でエラーが発生してもtrueしか返らないので、詳細な結果がほしい場合はFMDelete(true)を使うようにしよう。

FMDelete(true)を使用することで、errorCodeなどが返るようになる。この場合は「101: レコードが見つかりません」エラーが発生していることがわかる

FileMakerにはレコードの編集・削除履歴が残らないので一度削除してしまったレコードを復帰させることはできない。削除フラグとして機能させるフィールドを用意して、フラグの内容によって削除されているとシステム側で判定するように組むのもひとつの手だ。

たとえば削除処理では実際にFMDelete()を行うのではなく、AddDPParam('validFlg', 0)でFMEdit()を実施するだけにしておく。各種検索ではAddDPParam('validFlg', 1)とし、削除扱いとなっているレコードを対象から外すようにしておけば、うっかり間違えて削除してしまったレコードでも復帰が可能だ。Webアプリケーションの実装に関わらずFileMaker単体でシステムを組むときにでも使用できる小ネタなので、状況に応じてうまく使いわけよう。

このほか編集処理と削除処理には、レコードIDのほかに修正ID(-modid)も同時に引数として使用することが可能だ。レコードIDと修正IDを同時にリクエストに含めた場合、FileMakerはレコードIDと修正IDが一致した場合にのみ処理を行う(一致しない場合は306エラーが返る)。レコードIDのみでは複数ユーザの同時アクセスによる排他処理が行われないので、実際にWebアプリケーションを組む場合はかならず指定するようにしておこう。

修正IDはレコードを編集したときに+1される。修正IDを持たせておけば、同時に編集処理が実施された場合に修正IDが一致しなかった側に「306: レコード修正 ID が一致しません」エラーが返る

やや駆け足気味にだが、FX.phpによるCRUDの実装方法を紹介した。

次回は実際にコードだけではなく、リストやフォームといった実際の画面を交えての実装方法を解説する。