【コラム】

FileMaker×PHPで作る、簡単・便利なWebアプリ

91 FX.phpで複合検索をおこなうには(2)

 

91/116

FX.php、FileMaker API for PHPの基本操作からパフォーマンス比較、そしてFMCakeMixの基本操作チュートリアルを紹介してきた。前回より、FX.phpで複合検索をおこなう方法に、-findquery/-queryの構造を簡単に紹介した。今回は-findquery/-queryを使った複合検索の、FX.phpでのコーディングについて取りあげよう。

FX.phpで複合検索をおこなうには - FX.phpでの実装

-findqueryと-queryを使って、実際にFX.phpで複合検索を実装してみよう。 FileMakerファイル情報は次のとおり。

  • ファイル名: fxphp_tips.fp7
  • テーブル名: gelende
  • レイアウト名: 複合検索テスト_ゲレンデ情報
  • フィールド: 別表、別図参照
フィールド名 コメント タイプ オプション
serial シリアルナンバ 数字 番号自動入力, ユニークな値
registTimeStamp 登録日時 タイムスタンプ 作成タイムスタンプ
updateTimeStamp 更新日時 タイムスタンプ 修正タイムスタンプ
name ゲレンデ名 テキスト  
uri URI テキスト  
address 住所 テキスト  
length 最大滑走距離 数字  
maxAngle 最大斜度 数字  

作成したフィールド一覧

フィールドで管理する情報

このデータベースでは、関東圏近郊のスキー・スノーボードゲレンデの一部の情報を管理している

このサンプルデータベースでは、スキー・スノーボードゲレンデの情報を管理している。住所や最大滑走距離、最大斜度を使って複合検索条件をためしに作成してみる。

たとえば「群馬県内の、最大滑走距離が3000以上または最大斜度が30以上」のゲレンデを絞り込んで表示してみよう。

検索条件

  • 1番目の検索条件: フィールド「address」に&quot群馬"がふくまれているかつ、フィールド「length」が"3000"以上であること
  • 2番目の検索条件: フィールド「address」に&quot群馬"がふくまれているかつ、フィールド「maxAngle」が"30"以上であること

前回の順番に沿って、クエリを組み立てる。

  1. クエリIDとFileMakerフィールド名を紐付け
  2. クエリIDに検索したい文字列を指定
  3. クエリIDを使用して、検索条件を組み立てる

クエリIDとFileMakerフィールド名を紐付け

まずクエリIDとFileMakerフィールド名を紐づける。今回の複合検索条件の場合だと、使用するクエリID数は3つ。

  • -q1: address
  • -q2: length
  • -q3: maxAngle

このクエリを連結すると、次の文字列になる。

-q1=address&-q2=length&-q3=maxAngle

クエリIDに検索したい文字列を指定

続いて、クエリIDに検索したい文字列を指定する。

  • -q1.value: 群馬
  • -q2.value: >=3000
  • -q3.value: >=30

ここでは演算子"gte"を使わず、直接">="を検索条件にもちいる。このクエリを連結すると、次の文字列になる。

-q1.value=群馬&-q2.value=>=3000&-q3.value=>=30

クエリIDを使用して、検索条件を組み立てる

最後に、-queryクエリパラメータでクエリIDを指定して、検索条件を組み立てる。

-query=(q1,q2);(q1,q3)

これらのクエリを連結して検索リクエストを発行すると次の構文となる。

-q1=address&-q2=length&-q3=maxAngle&
-q1.value=群馬&-q2.value=>=3000&-q3.value=>=30&
-query=(q1,q2);(q1,q3)&
-findquery

このクエリはFileMaker Proで検索をおこなう場合、次の検索条件と同様の意味となる。

上記複合検索条件をFileMaker Pro上で再現した場合

FX.phpを使った実装例は次のとおり。

FX.php修正箇所 - 75行目付近

var $actionArray = array(
        // for backwards compatibility
        "-delete"               =>"-delete",
        "-dup"                  =>"-dup",
        "-edit"                 =>"-edit",
        "-find"                 =>"-find",
        "-findall"              =>"-findall",
        "-findany"              =>"-findany",
        "-new"                  =>"-new",
        "-view"                 =>"-view",
        "-dbnames"              =>"-dbnames",
        "-layoutnames"          =>"-layoutnames",
        "-scriptnames"          =>"-scriptnames",
        "-sqlquery"             =>"-sqlquery",
        // new params for DoFXAction
        "delete"                =>"-delete",
        "duplicate"             =>"-dup",
        "update"                =>"-edit",
        "perform_find"          =>"-find",
        "show_all"              =>"-findall",
        "show_any"              =>"-findany",
        "new"                   =>"-new",
        "view_layout_objects"   =>"-view",
        "view_database_names"   =>"-dbnames",
        "view_layout_names"     =>"-layoutnames",
        "view_script_names"     =>"-scriptnames",
        "-findquery"            =>"-findquery"
    );

最初にFX.phpの$actionArrayの最下部に、-findqueryの1行を追加している。これは、FX.phpのDoFXActionで-findqueryをリクエストできるようにするためのもの。

FX.php 複合検索サンプル - fx_compoundFind.php

<?php
include_once('../fx/FX.php');
include_once('../fx/FX_Fuzzy_Debugger.php');

$data = new FX('localhost', 80, 'FMPro9', 'http');

$data->SetDBData('fxphp_tips.fp7','複合検索テスト_ゲレンデ情報');
$data->SetDBUserPass('admin','');

$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');

// 1. クエリIDとFileMakerフィールド名を紐付け
$data->AddDBParam('-q1', 'address');
$data->AddDBParam('-q2', 'length');
$data->AddDBParam('-q3', 'maxAngle');

// 2. クエリIDに検索したい文字列を指定 
$data->AddDBParam('-q1.value', '群馬');
$data->AddDBParam('-q2.value', '>=3000');
$data->AddDBParam('-q3.value', '>=30');

// 3. クエリIDを使用して、検索条件を組み立てる
$data->AddDBParam('-query', '(q1,q2);(q1,q3)');

// 検索実行
$result = $data->DoFXAction('-findquery', true, true, 'full');

?>
<table>
    <tr>
        <th>
            serial
        </th>
        <th>
            ゲレンデ名
        </th>
        <th>
            住所
        </th>
        <th>
            最大滑走距離
        </th>
        <th>
            最大斜度
        </th>
    </tr>
<?php
foreach ($result['data'] as $key => $record)
{
    ?>
    <tr>
        <td>
            <?php echo $record['serial'][0]; ?>
        </td>
        <td>
            <?php echo $record['name'][0]; ?>
        </td>
        <td>
            <?php echo $record['address'][0]; ?>
        </td>
        <td>
            <?php echo number_format($record['length'][0]); ?>m
        </td>
        <td>
            <?php echo $record['maxAngle'][0]; ?>
        </td>
    </tr>
    <?php
}
?>

クエリIDの指定やクエリの構築には、AddDBParamをもちいる。

// 1. クエリIDとFileMakerフィールド名を紐付け
$data->AddDBParam('-q1', 'address');
$data->AddDBParam('-q2', 'length');
$data->AddDBParam('-q3', 'maxAngle');

// 2. クエリIDに検索したい文字列を指定 
$data->AddDBParam('-q1.value', '群馬');
$data->AddDBParam('-q2.value', '>=3000');
$data->AddDBParam('-q3.value', '>=30');

// 3. クエリIDを使用して、検索条件を組み立てる
$data->AddDBParam('-query', '(q1,q2);(q1,q3)');

-findqueryはFMFind()やFMFindAny()のように、専用のメソッドが用意されていないのでDoFXActionで代用する。

$result = $data->DoFXAction('-findquery', true, true, 'full');

これで$resultに結果セットが返るので、foreachで検索に該当したレコードを展開する。Webブラウザでfx_compoundFind.phpを確認してみよう。

FileMaker Proでさきほどの複合検索をおこなった結果。このデータ内での該当は9件

Webブラウザでfx_compoundFind.phpを表示。FileMaker Pro上でおこなった検索と同じ結果がWebブラウザで表示でき、FX.phpで複合検索が実装できていることがわかる

ひとつ気をつけたいのは、-findqueryをもちいた場合、-query以外の検索クエリは無視されるということ。たとえば今回のサンプルの場合、「住所が群馬であること」というのは共通の検索条件。この場合

$data->AddDBParam('address', '群馬');
$data->AddDBParam('-q1', 'length');
$data->AddDBParam('-q2', 'maxAngle');
$data->AddDBParam('-q1.value', '>=3000');
$data->AddDBParam('-q2.value', '>=30');
$data->AddDBParam('-query', '(q1);(q2)');
$result = $data->DoFXAction('-findquery', true, true, 'full');

と書きたくなるところだが、この構文ではうまく動作しないので注意されたい。FX.phpで-query/-findqueryをもちいた検索では、これまで紹介してきたものと若干性質が異なる動作をする。いくつも検索パターンを試し、動作する/動作しないの確認をとっておきたいところだ。

91/116

インデックス

連載目次
第116回 最新の情報を追い続ける
第115回 簡易エラーロギングで、トラブルシューティングをより素早く(2)
第114回 簡易エラーロギングで、トラブルシューティングをより素早く(1)
第113回 表示方法「表形式」の落とし穴
第112回 FileMaker Webアプリで見落としやすいセキュリティのポイント
第111回 外部データソースに注意! Web公開が遅くなったときのチェック
第110回 FX_Fuzzy_Debuggerで補足できるエラー
第109回 FileMakerデバッグの際に有用なツールを自作する
第108回 繰り返しフィールドを扱うときの注意点
第107回 FX.phpのデバッグメッセージをコンソールに表示する
第106回 FileMaker Serverの「使用状況」とは
第105回 Web経由でのCSVエクスポート
第104回 Web公開でのグラフ表示にチャレンジ
第103回 データベースデザインレポートを活用したWeb帳票(4)
第102回 データベースデザインレポートを活用したWeb帳票(3)
第101回 データベースデザインレポートを活用したWeb帳票(2)
第100回 データベースデザインレポートを活用したWeb帳票(1)
第99回 SetLogicalOR()と空白・改行文字の取扱いについて
第98回 FMCakeMixでスクリプトを二重起動させない方法
第97回 コマンドラインを活用したメンテナンス方法(3)
第96回 コマンドラインを活用したメンテナンス方法(2)
第95回 コマンドラインを活用したメンテナンス方法
第94回 FMFind()とFMView()の処理の違いとは
第93回 オブジェクトフィールドからファイル参照への移行法
第92回 FX.phpで複合検索をおこなうには(3)
第91回 FX.phpで複合検索をおこなうには(2)
第90回 FX.phpで複合検索をおこなうには(1)
第89回 Hello, FMCakeMix! チュートリアル(14)
第88回 Hello, FMCakeMix! チュートリアル(13)
第87回 Hello, FMCakeMix! チュートリアル(12)
第86回 Hello, FMCakeMix! チュートリアル(11)
第85回 Hello, FMCakeMix! チュートリアル(10)
第84回 Hello, FMCakeMix! チュートリアル(9)
第83回 Hello, FMCakeMix! チュートリアル(8)
第82回 Hello, FMCakeMix! チュートリアル(7)
第81回 Hello, FMCakeMix! チュートリアル(6)
第80回 Hello, FMCakeMix! チュートリアル(5)
第79回 Hello, FMCakeMix! チュートリアル(4)
第78回 Hello, FMCakeMix! チュートリアル(3)
第77回 Hello, FMCakeMix! チュートリアル(2)
第76回 Hello, FMCakeMix! チュートリアル(1)
第75回 最新FMCakeMixの動向を追う(3)
第74回 最新FMCakeMixの動向を追う(2)
第73回 最新FMCakeMixの動向を追う
第72回 FileMaker Webアプリを支えるライブラリ集
第71回 メンテ必須事項! 長期運用でのポイント(4)
第70回 メンテ必須事項! 長期運用でのポイント(3)
第69回 メンテ必須事項! 長期運用でのポイント(2)
第68回 メンテ必須事項! 長期運用でのポイント(1)
第67回 FileMaker Server 10→11での変更点
第66回 FX.php/APIの違い - スクリプトの実行
第65回 FX.php/APIの違い - レコード削除
第64回 FX.php/APIの違い - レコード編集(2)
第63回 FX.php/APIの違い - レコード編集(1)
第62回 FX.php/APIの違い - レコード検索(7)
第61回 FX.php/APIの違い - レコード検索(6)
第60回 FX.php/APIの違い - レコード検索(5)
第59回 FX.php/APIの違い - レコード検索(4)
第58回 FX.php/APIの違い - レコード検索(3)
第57回 FX.php/APIの違い - レコード検索(2)
第56回 FX.php/APIの違い - レコード検索(1)
第55回 FX.php/APIの違い - レコード登録(2)
第54回 FX.php/APIの違い - レコード登録(1)
第53回 番外編: CakePHPでFileMakerを使う方法
第52回 レコードの取扱いに特化したクラス"FileMaker_Record" (3)
第51回 レコードの取扱いに特化したクラス"FileMaker_Record" (2)
第50回 レコードの取扱いに特化したクラス"FileMaker_Record" (1)
第49回 結果セットの取扱いに特化したクラス、FileMaker_ResultSet(2)
第48回 結果セットの取扱いに特化したクラス、FileMaker_ResultSet(1)
第47回 ポータル情報の取得に特化したクラス、FileMaker_Field
第46回 フィールド情報の取得に特化したクラス、FileMaker_Field(4)
第45回 フィールド情報の取得に特化したクラス、FileMaker_Field(3)
第44回 フィールド情報の取得に特化したクラス、FileMaker_Field(2)
第43回 フィールド情報の取得に特化したクラス、FileMaker_Field(1)
第42回 レイアウト情報取得に特化したFileMaker_Layout(3)
第41回 レイアウト情報取得に特化したFileMaker_Layout(2)
第40回 レイアウト情報取得に特化したFileMaker_Layout(1)
第39回 API for PHPの中枢、FileMakerクラス(3)
第38回 API for PHPの中枢、FileMakerクラス(2)
第37回 API for PHPの中枢、FileMakerクラス(1)
第36回 API for PHPでのオブジェクトフィールド取り扱い
第35回 API for PHPでのレコード複製・削除方法、関連メソッド紹介
第34回 API for PHPでのレコード編集方法、関連メソッド紹介(2)
第33回 API for PHPでのレコード編集方法、関連メソッド紹介(1)
第32回 API for PHPでのレコード検索、関連メソッド紹介(2)
第31回 API for PHPでのレコード検索、関連メソッド紹介(1)
第30回 API for PHPを使うなら覚えておきたいvalidateの使い方
第29回 API for PHPでのレコード登録方法、関連するメソッドの紹介(2)
第28回 API for PHPでのレコード登録方法、関連するメソッドの紹介(1)
第27回 API for PHPでのDB接続手順、レコード表示まで(2)
第26回 API for PHPでのDB接続手順、レコード表示まで(1)
第25回 2大ライブラリのもうひとつ、API for PHPを試す
第24回 スピードアップのための徹底チューニング(6) 総集編
第23回 スピードアップのための徹底チューニング(6) スクリプトを活用せよ
第22回 スピードアップのための徹底チューニング(5) 続・集計には中間テーブル
第21回 スピードアップのための徹底チューニング(4) 集計には中間テーブル
第20回 スピードアップのための徹底チューニング(3) 集計フィールドは置かない
第19回 スピードアップのための徹底チューニング(2) 検索実装の御法度
第18回 スピードアップのために徹底チューニング(1) フィールドの配置法
第17回 見落としがちな「アカウントとアクセス権」の管理術
第16回 「CSVからデータをインポートしたい」には要注意!(2) - 実装編
第15回 「CSVからデータをインポートしたい」には要注意!(1) - まずは解説から
第14回 エラーコード早見表 & お手軽デバッグ「Fuzzy_Debugger」
第13回 値一覧でユーザビリティアップ! JavaSciptを活用せよ
第12回 オブジェクトフィールドから脱却! よりよいパフォーマンスを出す実装とは
第11回 オブジェクトフィールドは鬼門?! Webから取り扱うときの注意点
第10回 PHPデプロイ/FMサーバ管理者必見、カスタマイズすべき設定
第9回 PHPのインストール~FileMakerデプロイ
第8回 FileMaker Webアプリのインストール
第7回 FileMakerといえば帳票! さくっとデザインしてWebからPDFダウンロード
第6回 FileMakerならではのメリットを出すには - スクリプトを活用せよ
第5回 基礎編はこれで終わり! - 詳細/変更/削除処理
第4回 いよいよUIの実装へ! 最初は登録/一覧画面
第3回 FileMakerのCRUDはこれで完璧! - FMEdit()~FMDelete()まで
第2回 レコードの登録 - 各種関数・メソッドの紹介
第1回 まずは2大ライブラリを比較

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

JSOL、AWS上のSAP S/4HANA向け運用監視サービスを提供開始
[17:37 7/28] 企業IT
デジオン、DIGAの録画番組を外出先で視聴できるWindowsアプリ
[17:37 7/28] パソコン
ポケモンGOを子どもに利用させる際、気をつけるべきポイント9つ
[17:32 7/28] ライフスタイル
劇場版『仮面ライダーゴースト/ジュウオウジャー』キャスト陣が浴衣でテレ朝夏祭りに集結 - 沢村一樹「"うなじ"覚えて帰って」
[17:30 7/28] ホビー
檀れい、R・ヒラニ監督との初対面に涙「素晴らしい映画をありがとう」
[17:30 7/28] エンタメ

求人情報