FileMaker API for PHPを使用し、FileMakerデータベースへの接続と、指定したテーブルへアクセスしレコードを取得する方法を2回にわたり紹介している。前回はおもにDB接続までのコードと使用するメソッドについて紹介した。今回は残りの部分、レコードの表示箇所について取りあげよう。

API for PHPでのレコード表示手順

$findCommandのexecute()後、おもに$resultには次の情報が格納される。

  • DB接続に使用した情報(文字コード, ロケール, ホスト情報, DB名, ユーザ名, パスワード)
  • レイアウト情報(レイアウト名, レイアウトに配置されているフィールド[各種オプションを含む])
  • レコード情報
  • レコード総数, 対象レコード数, 取得レコード数

格納される情報量が非常におおいので、各自var_dump()などでどのような情報が格納されているかをひととおり確認しておくことをおすすめする。それでは、レコード情報を取得するところからはじめてみよう。

fmapi_test.php

<?php

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

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

$findCommand = $data->newFindAllCommand('fmapi_list');

$result = $findCommand->execute();

if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getCode();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理..
    $records = $result->getRecords();
    foreach ($records as $record)
    {
        echo '<p>';
        echo $record->getField('ft_serial') . ' , ';
        echo $record->getField('ft_registTimeStamp') . ' , ';
        echo $record->getField('ft_updateTimeStamp');
        echo '</p>';
    }
}

?>

実際にWebブラウザでこれを表示してみよう。

正常に処理がおこなわれた場合。foreachでレコード情報が順に表示された

なにかエラーが発生した場合はFileMaker::isError($result)がtrueとなり、エラー処理がおこなわれる。$result->getCode()と$result->getMessage()の内容が表示された

データベース「fmapi_test.fp7」に接続し、レイアウト「fmapi_list」に表示されているレコードを全件取得後、エラー処理。エラーが発生した場合はエラー表示、正常処理の場合はgetRecords()で$resultからレコード情報をすべて抜き出し、foreachで順に書出しをおこなっている。前回はレコードを全件取得するところまで($result = $findCommand->execute();)を紹介したので、今回はおもに11行目以降のエラー処理、正常処理の部分についてどのような処理がおこなわれているかを取りあげよう。まずはエラー処理からだ。

fmapi_test.php 14-15行目

echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';

FileMaker_Errorオブジェクトからエラーコードおよびエラーメッセージを取得する。このメソッドについては、PEAR_ErrorgetCode()およびgetMessage()を参照されたい。

FileMaker_ErrorオブジェクトはFileMakerエラーが発生した場合のみに格納される。したがって、FileMaker::isError($result)がfalseの状態で$result->getCode()や$result->getMessage()をおこなおうとするとFatal error: Call to undefined methodが返るので注意しよう。続けて正常処理のコードに移る。

fmapi_test.php 20行目

$records = $result->getRecords();

$resultのFileMaker_Resultオブジェクトより、配列をふくんだレコード情報を返す。

getRecordsメソッド (Result.php 57-66行より)

    /**
     * Returns an array containing each record in the result set. Each
     * member of the array is a FileMaker_Record object, or an
     * instance of the class name set in the API for instantiating
     * Records. The array may be empty if the response contains no
     * records.
     *
     * @return array The record objects.
     */
    function &getRecords()

$recordsには配列を含んだFileMaker_Recordオブジェクトが返るので、あとは$recordsをforeachで反復処理させる流れとなる。

fmapi_test.php 25-27行目

echo $record->getField('ft_serial') . ' , ';
echo $record->getField('ft_registTimeStamp') . ' , ';
echo $record->getField('ft_updateTimeStamp');

$recordよりフィールドに格納されている値を取り出す。結果は文字列型として返り、その際いくつかの特殊文字はHTMLエンティティに変換される。

getFieldメソッド (Record.php 77-86行より)

    /**
     * Get the HTML-encoded value of $field.
     *
     * @param string $field The field name to fetch.
     * @param integer $repetition The repetition number to get,
     *                            defaults to the first repetition.
     *
     * @return string The field value.
     */
    function getField($field, $repetition = 0)
  • $field: フィールド名を指定
  • $repetition: レコード番号を指定。デフォルト値は0

HTMLエンティティに変換されると都合が悪い場合は、getFieldUnencoded()を代わりに使用する。

レコード内容を取得するまでを紹介した。なお、ここまでをFX.phpで実装すると次のようなコードとなる。

fmfx_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');

$result = $data->FMFindAll();

if ( '0' === (string)$result['errorCode'])
{
    // 正常処理..

    foreach ($result['data'] as $record)
    {
        echo '<p>';
        echo $record['ft_serial'][0] . ' , ';
        echo $record['ft_registTimeStamp'][0] . ' , ';
        echo $record['ft_updateTimeStamp'][0];
        echo '</p>';
    }
}
else
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result['errorCode'];
    echo '<p>'. $errorsList[$result['errorCode']] . '</p>';
}

?>

FX.phpにはFileMaker API for PHPのgetMessage()に相当する機能がないため、FX.phpのグローバル変数「$errorsList」に格納されているエラー内容の配列を利用してエラーメッセージを表示している。

fmfx_test.phpをWebブラウザで表示した結果。コード実装は違うが、結果はまったく同じだ。なお、FX.phpではファイルを開けないアカウントを指定した場合$resultにFX_Errorオブジェクトが返りFatal errorを起こすので注意しよう

最後に実行速度を比較しておこう。本連載ではもはやおなじみとなったApache Bench(ab)を使用して計測をした。requestsは100、concurrencyは3にセットしている。

fmapi_test.phpへの実行結果

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80

Document Path:          /~hiroaki/mycom-demos/20090811-filemaker_fxphp_25/20090825/fmapi_test.php
Document Length:        157 bytes

Concurrency Level:      3
Time taken for tests:   2.218 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      40800 bytes
HTML transferred:       15700 bytes
Requests per second:    45.09 [#/sec] (mean)
Time per request:       66.532 [ms] (mean)
Time per request:       22.177 [ms] (mean, across all concurrent requests)
Transfer rate:          17.97 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:    42   66  11.7     67     113
Waiting:       42   66  11.7     67     113
Total:         42   66  11.7     67     113

Percentage of the requests served within a certain time (ms)
  50%     67
  66%     72
  75%     75
  80%     75
  90%     79
  95%     83
  98%     96
  99%    113
 100%    113 (longest request)

fmfx_test.phpへの実行結果

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80

Document Path:          /~hiroaki/mycom-demos/20090811-filemaker_fxphp_25/20090825/fmfx_test.php
Document Length:        157 bytes

Concurrency Level:      3
Time taken for tests:   1.964 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      40800 bytes
HTML transferred:       15700 bytes
Requests per second:    50.91 [#/sec] (mean)
Time per request:       58.929 [ms] (mean)
Time per request:       19.643 [ms] (mean, across all concurrent requests)
Transfer rate:          20.28 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:    33   58  47.2     50     327
Waiting:       32   58  47.2     50     327
Total:         33   58  47.2     50     327

Percentage of the requests served within a certain time (ms)
  50%     50
  66%     53
  75%     55
  80%     57
  90%     60
  95%     65
  98%    322
  99%    327
 100%    327 (longest request)

結果はFileMaker API for PHPが66.532 [ms]、FX.phpが58.929 [ms]となった。取り扱うデータ量がおおいためか、FileMaker API for PHPと比較するとFX.phpの方が若干はやいがそこまで差はでない結果となっている。

2回にわたりFileMakerデータベースへの接続と、指定したテーブルへアクセスしレコードを取得する方法を紹介した。今回紹介した機能は必要最低限のライン。このほかにも便利なメソッドはおおくあるので、必要に応じて追って取りあげていこう