【问题标题】:Sql search query for my search form in coldfusion我在coldfusion中的搜索表单的Sql搜索查询
【发布时间】:2016-04-14 05:57:30
【问题描述】:

我为我的应用程序创建了一个搜索表单。我现在想通过从 productID、ProductName、ProductCostFrom 和 ProductCostTO 中一次获取 1 个或多个输入来在数据库中进行搜索。我正在使用以下查询进行搜索。如果我在输入中给出一个成本范围,它工作得很好,但如果我只搜索“ProID”或“ProName”或两者兼而有之,则会出现语法错误。

<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>

【问题讨论】:

  • 那个时候,(#Form.Procost#)的值是多少?

标签: mysql sql-server coldfusion


【解决方案1】:

请记住,您发送到数据库的任何查询都必须是有效 SQL。当成本值丢失(或包含非数字值)时,生成的 SQL 格式将不正确。如果两个字段都为空,则 where 子句将如下所示(错误):

where  ( Procost BETWEEN AND )

.. 而不是这个:

where  ( Procost BETWEEN 50 AND 100 )

如果搜索值是可选的,则需要有条件地构建 SQL 语句。一种常见的方法是从一个永远不会为真的静态条件开始,因此查询仅在其他过滤器匹配时才返回记录:

WHERE 1 = 0

然后仅在填充了必要的表单字段时才附加过滤器。虽然总是使用 cfqueryparam 来防止 sql 注入。

<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 ...

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2010-12-03
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    相关资源
    最近更新 更多