2016-04-14 13 views
0

私のアプリケーション用の検索フォームを作成しました。私は今、productID、ProductName、ProductCostFrom、ProductCostTOから一度に1つまたは複数の入力からの入力を取ってデータベースを検索したいと思っています。私は検索するために次のクエリを使用しています。入力でコストの範囲を指定すると静かに動作しますが、「ProID」または「ProName」またはその両方だけを検索すると構文エラーが発生します。Coldfusionでの検索フォームのSql検索クエリ

<cfquery name="myquery" datasource="cfdb2"> 
    Select * 
    from ProEntry 
    where (
       Procost BETWEEN #Form.Procost# AND #Form.ProCostTo# 
      ) 
    OR  (
      Proid='#form.Proid#' OR 
      Proname='#form.Proname#' 
      ) 
</cfquery> 
+0

その時、(#Form.Procost#)の値は何ですか? –

答えて

5

有効 SQLでなければなりませんあなたがデータベースに送信どんなクエリ、覚えておいてください。コスト値が欠けている場合(または数値以外の値を含む場合)は、生成されたSQLの形式が正しくありません。両方のフィールドが空の場合句は、この(間違った)のようになります。ここで

where (Procost BETWEEN AND) 

を...これに代えて:検索値がオプションである場合

where (Procost BETWEEN 50 AND 100) 

は、あなたがSQLステートメントを構築する必要があります条件付きで一般的なアプローチは、決して真にはならない静的な状態で起動するので、他のフィルタが一致した場合、クエリはレコードのみを返します。必要なフォームフィールドが移入されている場合にのみ

WHERE 1 = 0 

を次にフィルターを追加します。 では、SQLインジェクションから保護するために常にcfqueryparamを使用します。

<cfif isNumeric(form.Procost) AND isNumeric(form.ProCostTo)> 
    OR (
     Procost BETWEEN 
      <cfqueryparam value="#form.Procost#" cfsqltype="{replace_with_your_type}"> 
     AND 
      <cfqueryparam value="#form.ProCostTo#" cfsqltype="{replace_with_your_type}"> 
    ) 
</cfif> 

<cfif len(trim(form.proID))> 
    OR Proid= <cfqueryparam value="#form.proID#" cfsqltype="{replace_with_your_type}"> 
</cfif> 

... etcetera ...