FileMaker API for PHPを使用し、FileMakerデータベースへの接続と、指定したテーブルへアクセスしレコードを取得する方法を紹介してきた。今回はレコードの登録に関連する機能を中心に取りあげよう。
API for PHPでのレコード登録手順
FileMaker API for PHPではおもに次の手順でレコードを登録する。
- newAddCommand()でFileMaker_Command_Addオブジェクトを生成
- setField(フィールドタイプが日付, 時刻, タイムスタンプの場合はsetFieldFromTimestamp)を使用し、フィールドに格納したい内容を登録
- execute()でクエリを発行し、レコードを登録
まずは実際にコードを書いてみよう。ここでは「API for PHPでのDB接続手順、レコード表示まで(1)」で使用したファイルのテーブルに「fm_text(テキストフィールド)」「fm_date(日付フィールド)」の2フィールドを加えたものを使用する。
テーブル「fmapi_table」のフィールド定義。「API for PHPでのDB接続手順、レコード表示まで(1)」から使用してきたテーブルに2フィールドを追加している |
レイアウト「fmapi_list」。作成した2フィールドを追加で配置している |
fmapi_new_test.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$newCommand = $data->newAddCommand('fmapi_list');
$result = $newCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getErrorString();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
echo 'done.';
}
?>
このコードではデータベース「fmapi_test.fp7」に接続し、レイアウト「fmapi_list」上でレコードを登録する。setField()もsetFieldFromTimestamp()も使用しない、シンプルな例だ。
fmapi_new_test.php 7行目
$newCommand = $data->newAddCommand('fmapi_list');
FileMaker_Command_Addオブジェクトを作成し、$newCommandに割り当てる。
newAddCommandメソッド (FileMaker.php 187-197行目より)
/**
* Create a new FileMaker_Command_Add object.
*
* @param string $layout The layout to add to.
* @param array $values A hash of fieldname => value pairs. Repetions can be set
* by making the value for a field a numerically indexed array, with the numeric keys
* corresponding to the repetition number to set.
*
* @return FileMaker_Command_Add The new add command.
*/
function &newAddCommand($layout, $values = array())
- $layout: レコードを登録したいレイアウトを指定
- $values: フィールド名と登録したい内容がセットになったハッシュを指定
$valuesにはデフォルト引数として空の配列が渡されるので省略可。
実際にこのコードを実行してみよう。Webブラウザでfmapi_new_test.phpにアクセスする。
Webブラウザでfmapi_new_test.phpにアクセス。「done.」と表示されていることから、正常に処理が完了していることがわかる |
表示直後のレイアウト「fmapi_list」。あたらしくレコードが登録されていることがわかる |
今度は実際にフィールドになにか値を登録してみよう。fmapi_new_test.phpの一部を使用する。
fmapi_new_test_2.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$newCommand = $data->newAddCommand('fmapi_list');
$newCommand->setField('ft_text', 'テスト文字列');
$newCommand->setFieldFromTimestamp('ft_date', mktime(0,0,0,9,1,2009));
$result = $newCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
echo 'done.';
}
?>
fmapi_new_test.phpの動きに加え、2フィールドそれぞれに値を指定している。
fmapi_new_test_2.php 9-10行目
$newCommand->setField('ft_text2', 'テスト文字列');
$newCommand->setFieldFromTimestamp('ft_date', mktime(0,0,0,9,1,2009));
テキストフィールド「ft_text2」に"テスト文字列"、日付フィールド「ft_date」に"2009/9/1"(UNIXタイムスタンプ(1251730800)を使用して変換)を指定している。
setFieldメソッド(Command/Add.php 52-60行より)
/**
* 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)
- $field: フィールド名を指定
- $value: 登録したい値を指定
- $repetition: 繰り返しフィールドの場合、繰り返し番号を指定
$repetitionにはデフォルト引数として0が指定されているため、省略が可能。
setFieldFromTimestampメソッド(Command/Add.php 65-79行より)
/**
* Set the new value for a date, time, or timestamp field from a
* unix timestamp value. If the field is not a date or time field,
* then an error is returned. Otherwise returns true.
*
* If we haven't already loaded layout data for the target of this
* command, calling this method will cause it to be loaded so that
* the type of the field can be checked.
*
* @param string $field The field to set.
* @param string $timestamp The timestamp value.
* @param integer $repetition The repetition number to set,
* defaults to the first repetition.
*/
function setFieldFromTimestamp($field, $timestamp, $repetition = 0)
- $field: フィールド名を指定
- $timestamp: UNIXタイムスタンプを指定
- $repetition: 繰り返しフィールドの場合、繰り返し番号を指定
$repetitionにはデフォルト引数として0が指定されているため、省略が可能。UNIXタイムスタンプを生成する場合はmktimeが便利だろう。もちろんsetFieldでも代用可能。たとえば
$newCommand->setFieldFromTimestamp('ft_date', mktime(0,0,0,9,1,2009));
は
$newCommand->setField('ft_date', '9/1/2009');
と同義だ。
実際にこのコードを実行してみよう。Webブラウザでfmapi_new_test_2.phpにアクセスする。
Webブラウザでfmapi_new_test_2.phpにアクセス直後のレイアウト「fmapi_list」。あたらしくレコードが登録され、2フィールドそれぞれにPHPで指定した値が登録されている |
レイアウトに配置していないフィールドを指定した場合はエラーが返る |
レイアウトに配置していないフィールドを指定した場合はFX.phpと同様、エラーが返る。しかしこの場合「Field Not Found」というエラー文字列だけが返り、なぜかgetCode()ではエラー番号を取得できない(/Implementation/LayoutImpl.php内の文字列だけが返り、FileMakerエラーコードの102「Field is missing」が返らない)。知らないとハマりやすい箇所なので注意されたい。
setField()やsetFieldFromTimestamp()を使用しないで、あらかじめフィールド名と登録したい値を配列にしておきnewAddCommand()時に指定する方法もある。
fmapi_new_test_3.php - 実行結果はfmapi_new_test_2とまったく同じ
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$setFieldArray = array
(
'ft_text' => 'テスト文字列',
'ft_date' => '9/1/2009'
);
$newCommand = $data->newAddCommand('fmapi_list', $setFieldArray);
$result = $newCommand->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
echo 'done.';
}
?>
各種バリデートをまったくおこなう必要がない場合は、newAddCommand('レイアウト名', $_GET), newAddCommand('レイアウト名', $_POST)といった表記も可能だ。
レコード登録用クラス「FileMaker_Command_Add」で使用するおもなメソッドを紹介した。ここまでをFX.phpで実装すると次のようなコードとなる。
fmfx_new_test.php
<?php
include_once('../fx/FX.php');
$data = new FX('localhost', 80, 'FMPro9', 'http');
$data->SetDBData('fmapi_test','fmapi_list');
$data->SetDBUserPass('admin','admin');
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
$data->AddDBParam('ft_text', 'テスト文字列');
$data->AddDBParam('ft_date', '9/1/2009');
$result = $data->FMNew();
if ( '0' === (string)$result['errorCode'])
{
// 正常処理..
echo 'done.';
}
else
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result['errorCode'];
echo '<p>'. $errorsList[$result['errorCode']] . '</p>';
}
?>
FX.phpにはFileMaker API for PHPのsetFieldFromTimestamp()に相当する機能がない。YYYY/MM/DD形式で日付を渡したい場合は変換用の関数を自作するか、sprintfなどを使おう。なお、FileMaker API for PHPにはこのほかにもvalidate()やsetResultLayout()といったFileMaker_Commandから継承する便利なメソッドがいくつかある、追って紹介していこう。