0

アプリケーションの起動時に使用したくないフィルターがあり、特定のアクションに対してのみ使用します。これについてすでに質問があることは知っていますが、役に立ちません。実際には両方の答えを理解していません。

呼び出されていない場合、フィルターだけでなく、すべてのデータセットを取得するために、「列 = 値または 1 = 1」のロジックを使用していました。

ここに私が書いたものがあります:

FILTER (([ct]='%ct%') or  '%ct%' = '%ct%')
VALIDATION
    'ct' '^[a-zA-Z\-]+$'
END

Openlayers 3でパラメーターを使用してレイヤーを呼び出します

url: 'http://localhost:5000/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/essai.map&SERVICE=WMS&VERSION=1.1.1%20&REQUEST=GetCapabilities', serverType: 'mapserver', params: {'LAYERS': 'aisdata', 'ct':'myvalue', 'TILED': true} });

しかし、すべてのデータセットが返されます。(マップファイルで削除する'%ct%' = '%ct%'と、フィルターが適切に適用されます)

私の状態を無視するのを手伝ってくれる人はいますか?

4

1 に答える 1

1

VALIDATION ブロックにデフォルト値を追加して、値がデフォルトで空の文字列になるようにし、値が空の文字列かどうかをチェックする FILER ブロックに OR 条件を追加します。

VALIDATION
    'ct' '^[a-zA-Z\-]+$'
    'default_ct' ''  # <-- ct will be a empty string if not provided via URL 
END
FILTER (([ct]='%ct%') or  ('%ct%' = '') )

データベース列ctに数値型がある場合、空の文字列を数値と比較できないため、前のフィルターは内部サーバー エラーを生成します。この場合、0 や -1 などの数値をデフォルトとして使用します。

于 2016-10-20T10:18:12.640 に答える