これまで、FileMaker API for PHPでのデータベース接続手順から、レコード登録方法・バリデートの使い方、検索・複合検索について取りあげてきた。今回は単一レコードの編集処理について取りあげよう。
単一レコードの編集はFX.phpとほぼ同様
FileMaker API for PHPではおもに次の手順でレコードを編集する。
- newEditCommand()でFileMaker_Command_Editオブジェクトを生成
- setField(フィールドタイプが日付, 時刻, タイムスタンプの場合はsetFieldFromTimestampでも可)を使用し、フィールドに格納したい内容を登録
- setRecordId()、setModificationId()で編集したいレコードID・修正IDを指定
- 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.」エラーが返る |
このように単一レコードの編集処理は簡単に記述することができる。いままで取りあげてきたバリデートや複合検索処理の実装と比較すると、かなりシンプルなコードとなる。
編集処理の実装で気をつけておきたいポイントとして「可能なかぎり修正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と異なり必須パラメータではないが、前述のとおり指定しておいたほうが良い引数だ。
単一レコードの編集処理について紹介した。次回は繰り返しフィールドをふくめた場合や、ポータルといったリレーション先テーブルのレコード編集方法について紹介しよう。