これまで、FileMaker API for PHPでのデータベース接続手順から、レコード登録方法・バリデートの使い方、検索・複合検索について取りあげてきた。今回は単一レコードの編集処理について取りあげよう。

単一レコードの編集はFX.phpとほぼ同様

FileMaker API for PHPではおもに次の手順でレコードを編集する。

  1. newEditCommand()でFileMaker_Command_Editオブジェクトを生成
  2. setField(フィールドタイプが日付, 時刻, タイムスタンプの場合はsetFieldFromTimestampでも可)を使用し、フィールドに格納したい内容を登録
  3. setRecordId()、setModificationId()で編集したいレコードID・修正IDを指定
  4. execute()でクエリを発行し、レコードを編集

手順的にはFileMaker API for PHPを使った単一レコードの編集処理は、FX.phpでおこなう場合とほぼ同様だ。異なるのはメソッド名くらいといったところ。

実際にコードを書く前に、使用するFileMakerのテーブル・フィールド・レイアウト情報を整理しておこう。

  • ファイル名: fmapi_test.fp7
  • テーブル名: fmapi_table
  • レイアウト名: fmapi_edit
  • 配置するフィールド: ft_serial(数字), ft_registTimeStamp(タイムスタンプ), ft_updateTimeStamp(タイムスタンプ), ft_text(テキスト), ft_num(数字), ft_date(日付), ft_recordId(計算), ft_modificationId(計算)
  • 編集対象のレコードID: 17

レイアウト「fmapi_edit」に配置したフィールド。ft_recordIdとft_modificationIdは編集時に必要になるレコードIDと修正IDを表示する計算フィールドで、PHPから編集はおこなわない

ft_recordIdは「Get ( レコード ID )」、ft_modificationIdは「Get ( レコード編集回数 )」関数でレコードIDと修正IDを取得している。この2フィールドはおもにデバッグ用途のために配置しているだけで、実際の編集処理には必要ない。それでは実際にコードを書いてみよう。

fmapi_edit_test.php

<?php

include_once('../FileMaker.php');

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');

$editCommand = $data->newEditCommand('fmapi_edit');

$editCommand->setField('ft_text', 'newEditCommand レコード編集処理テスト');
$editCommand->setField('ft_num', rand(1,10000));
$editCommand->setField('ft_date', '10/13/2009');

$editCommand->setRecordId(20);

$result = $editCommand->execute();

if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getErrorString();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理..
    $records = $result->getRecords();
    ?>
    <table border="1">
        <tr>
            <th>ft_serial</th>
            <th>ft_registTimeStamp</th>
            <th>ft_updateTimeStamp</th>
            <th>ft_text</th>
            <th>ft_num</th>
            <th>ft_date</th>
            <th>ft_recordId</th>
            <th>ft_modificationId</th>
        </tr>
    <?php
    foreach ($records as $record)
    {
        echo '<tr>';
        echo '<td>' . $record->getField('ft_serial') . '</td>';
        echo '<td>' . $record->getField('ft_registTimeStamp') . '</td>';
        echo '<td>' . $record->getField('ft_updateTimeStamp'). '</td>';
        echo '<td>' . $record->getField('ft_text'). '</td>';
        echo '<td>' . $record->getField('ft_num'). '</td>';
        echo '<td>' . $record->getField('ft_date'). '</td>';
        echo '<td>' . $record->getField('ft_recordId'). '</td>';
        echo '<td>' . $record->getField('ft_modificationId'). '</td>';
        echo '</tr>';
    }
    ?>
    </table>
<?php
}
?>

このサンプルではレコードIDのみを指定し、ft_text, ft_num, ft_dateに対してそれぞれ値を入力して編集実行クエリを発行している。実際にWebブラウザでアクセスしてみよう。

Webブラウザでfmapi_edit_test.phpを表示。編集処理がおこなわれ、結果が表示された。レコードIDしか指定していないため、リロードするごとにレコードの編集処理がおこなわれる

レコードIDを指定しなかった場合は「Edit commands require a record id.」エラーが返る

Webブラウザでfmapi_edit_test.phpを表示した直後のFileMaker画面。編集処理がおこなわれていることが確認できる。また、修正IDも+1されていることがわかる

このように単一レコードの編集処理は簡単に記述することができる。いままで取りあげてきたバリデートや複合検索処理の実装と比較すると、かなりシンプルなコードとなる。

編集処理の実装で気をつけておきたいポイントとして「可能なかぎり修正IDを指定すること」が挙げられる。修正IDは編集処理の必須指定項目ではないが、レコードIDのみを指定して編集をおこなう場合、競合処理の排他をおこなうことができない。実際に実装する場合は、かならずsetModificationId()を使用して修正IDを指定するように心がけよう。さきほどのファイルに修正IDを指定した行「$editCommand->setModificationId(1);」を追加し、再度Webブラウザで表示させてみる。

修正ID不一致により、「Record modification ID does not match」エラーが返った。編集処理に修正IDをはさむことで、違うユーザによる編集処理で競合がおこった場合も排他処理が可能となる

修正IDを指定しておくと、修正IDが一致した場合にはじめて編集処理が実行されるようになる。編集処理をおこなうと、その瞬間に修正IDは+1される。別ユーザが直前に編集処理をおこなったとしても、修正ID不一致により排他制御が起こるという仕組みだ。余分なトラブルを防ぐためにも、編集処理では修正IDをかならず指定するようにしておきたい。

サンプルコード中で使用したメソッドについて

FileMaker_Command_Editクラスに用意されている、サンプルコード中で使用したメソッドの使い方は次のとおり。

setFieldメソッド (Command/Edit.php 53-61行目より)

    /**
     * Set the new value for a field.
     *
     * @param string $field The field to set.
     * @param string $value The value for the field.
     * @param integer $repetition The repetition number to set,
     *                            defaults to the first repetition.
     */
    function setField($field, $value, $repetition = 0)
  • string $field: フィールド名を指定
  • string $value: 登録したい値を指定
  • integer $repetition: 繰り返しフィールドの場合、繰り返し番号を指定

$repetitionにはデフォルト引数として0が指定されているため、省略が可能。登録処理で使用したsetFieldメソッドとまったく同じものと考えて良いだろう。

setRecordIdメソッド (Command.php 129-137行目より)

    /**
     * Set the record id for this command. For Edit, Delete, and
     * Duplicate commands a record id must be specified. It is also
     * possible to find a single record by specifying its record
     * id. This method will be ignored by Add and FindAny commands.
     *
     * @param string $recordId The record id.
     */
    function setRecordId($recordId)
  • string $recordId: 編集をおこないたいレコードのレコードIDを指定する

このメソッドはFileMaker_Commandクラスより継承する。レコードIDは編集処理や削除処理、複製処理で必須パラメータとなっており、指定しない場合はエラーが返る。

setModificationIdメソッド (Command/Edit.php 85-90行目より)

    /**
     * Set the modification id for this command.
     *
     * @param integer $modificationId The modification id.
     */
    function setModificationId($modificationId)
  • integer $modificationId: 編集をおこないたいレコードの修正IDを指定する

修正IDはレコードIDと異なり必須パラメータではないが、前述のとおり指定しておいたほうが良い引数だ。

単一レコードの編集処理について紹介した。次回は繰り返しフィールドをふくめた場合や、ポータルといったリレーション先テーブルのレコード編集方法について紹介しよう。