FileMaker API for PHPを使用し、FileMakerデータベースへの接続と、指定したテーブルへアクセスしレコードを取得する方法を紹介してきた。今回はレコードの登録に関連する機能を中心に取りあげよう。

API for PHPでのレコード登録手順

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

  1. newAddCommand()でFileMaker_Command_Addオブジェクトを生成
  2. setField(フィールドタイプが日付, 時刻, タイムスタンプの場合はsetFieldFromTimestamp)を使用し、フィールドに格納したい内容を登録
  3. 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から継承する便利なメソッドがいくつかある、追って紹介していこう。