FX.phpにおいてWebアプリケーションを実装していると、動作を理解するにあたって取っつきづらい点がいくつか出てくる。そのうちのひとつが「SetLogicalOR()」と「検索文字列にふくまれる空白文字・改行文字の取扱い」についてだ。FileMaker Proクライアント上で改行を区切り文字として文字列の検索をおこなうと、その検索はAND検索となる。半角スペースを区切り文字とした場合と同じ動作だ。これをSetLogicalOR()と併用すると、なぜか若干動作が変わってくる。

SetLogicalOR()と空白・改行文字の取扱いについて

FileMaker Proクライアント上で、あるフィールドに対して"AAA BBB"と検索すると、「該当フィールドにAAAおよびBBBがふくまれる」レコードが抽出される。"&AAA(改行文字)BBBquot;と検索しても、この結果は同じ。ところがFX.phpでSetLogicalOR()を使った検索においてこれらの検索をおこなった場合、なぜか若干動作が変わってくる。これらの動作パターンと注意事項をまとめたので参考にしてほしい。

ここでの動作環境と使用したFileMakerファイルは次のとおり。

SetLogicalOR()とは

SetLogicalOR()はFX.phpに用意されているメソッドのひとつ。-lop(論理演算子)クエリ引数に"or"をわたす。

fms11_cwp_xslt_ja.pdfより-lopクエリ引数の動作説明を抜粋

-find クエリーコマンドに含まれる複数の検索条件を「and」または「or」のいずれの検索として組み合わせるかを指定します。
$this->AddDBParam('-lop', 'or');と同義。このメソッドに引数はない。

試行したパターンについて

試行したパターンは次のとおり。

  • AddDBParam()とFMFind()を利用した検索
  • AddDBParam()で同じフィールドに対して2回の検索
  • SetLogicalOR()の有無
  • AddDBParam()の検索文字列において、半角スペースを区切文字とする
  • AddDBParam()の検索文字列において、改行文字を区切文字とする

検索に使用したフィールドはaddress(住所)とmaxAngle(最大斜度)の2つ。それでは動作パターンを確認してみよう。

パターン番号 AddDB
Param(1)フィールド
AddDB
Param(1)検索文字列
AddDB
Param(2)フィールド
AddDB
Param(2)検索文字列
SetLogical
OR()の有無
検索結果
1 address 群馬     住所に群馬がふくまれる
2 address 群馬     住所に群馬がふくまれる
3 address 長野     住所に長野がふくまれる
4 address 長野     住所に長野がふくまれる
5 address 群馬 address 長野 住所に群馬および長野がふくまれる
6 address 群馬 address 長野 住所に群馬または長野がふくまれる
7 address 群馬 長野     住所に群馬および長野がふくまれる
8 address 群馬 長野     住所に群馬および長野がふくまれる
9 address 群馬(改行文字)長野     住所に群馬および長野がふくまれる
10 address 群馬(改行文字)長野     住所に群馬または長野がふくまれる
11 address 群馬 maxAngle >=30 住所に群馬がふくまれる、かつ最大斜度が30以上
12 address 群馬 maxAngle >=30 住所に群馬がふくまれる、または最大斜度が30以上
13 address 群馬 長野 maxAngle >=30 住所に群馬および長野がふくまれる、かつ最大斜度が30以上
14 address 群馬 長野 maxAngle >=30 住所に群馬および長野がふくまれる、または最大斜度が30以上
15 address 群馬(改行文字)長野 maxAngle >=30 住所に群馬および長野がふくまれる、かつ最大斜度が30以上
16 address 群馬(改行文字)長野 maxAngle >=30 住所に群馬または長野がふくまれる、または最大斜度が30以上

このうち注目したい動作は、パターン番号が8と10、そして16の3点。FileMaker Proクライアント上では半角スペース・改行を区切り文字にしても動作はおなじだった。しかしWeb公開においてSetLogicalOR()を使ったOR検索をおこなった場合、この2つの動作は変わってくる。SetLogicalOR()で-lopがorになっている状態で、検索文字列のうち改行を区切り文字とすると、その検索はANDにはならず、ORとなる(パターン10)。半角スペースを区切り文字とした場合はAND検索(パターン8)。

パターン16も、パターン14と同じ動作をすると思いがちだが、実際の動作は異なる。addressフィールドの検索文字列中に改行を区切り文字としたため、この検索条件は3つとなっている。

  • 住所に"群馬"がふくまれている
  • 住所に"長野"がふくまれている
  • 最大斜度が"30"以上

この動作を逆手に取って実装に利用する手もあるが、将来のバージョンアップで動作がどのように変わるかが想定できないので、なるべく利用しないように心がけたいところだ。ユーザの入力値をそのままAddDBParam()に渡している検索機能では、あらかじめtrim()やstr_replace()などで改行文字が含まれないようにしておこう。