Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有cfif的ColdFusion动态SQL_Coldfusion - Fatal编程技术网

带有cfif的ColdFusion动态SQL

带有cfif的ColdFusion动态SQL,coldfusion,Coldfusion,我正在尝试编写一个查询,它将接受从另一个页面传递的4个可能参数中的1个。用户将选择这些参数中的一个进行搜索,然后查询将根据传递的参数评估选择的参数。我正试图使用cfif来实现这一点,但我肯定错过了一些东西。也许是一个CFO或者其他人,或者也许我已经走远了。这样做会更好吗?我得到一个错误“变量代码”未定义。多谢各位 <cfquery name="Summary" datasource="dsn"> SELECT * FROM dispos

我正在尝试编写一个查询,它将接受从另一个页面传递的4个可能参数中的1个。用户将选择这些参数中的一个进行搜索,然后查询将根据传递的参数评估选择的参数。我正试图使用cfif来实现这一点,但我肯定错过了一些东西。也许是一个CFO或者其他人,或者也许我已经走远了。这样做会更好吗?我得到一个错误“变量代码”未定义。多谢各位

<cfquery name="Summary" datasource="dsn">
    SELECT
        *
    FROM
        disposal
    WHERE 1=1

    <cfif DivisionCode NEQ "false">
    AND DivisionCode = <cfqueryparam value="#url.DivisionCode#" 
   cfsqltype="cf_sql_varchar">
   </cfif>
   <cfif DistrictCode NEQ "false">
    AND DistrictCode = <cfqueryparam value="#url.DistrictCode#" 
   cfsqltype="cf_sql_varchar">
   </cfif>
   <cfif SiteCode NEQ "false">
    AND SiteCode = <cfqueryparam value="#url.SiteCode#" 
   cfsqltype="cf_sql_varchar">
  </cfif>
  <cfif RegionCode NEQ "false">
    AND RegionCode = <cfqueryparam value="#url.RegionCode#" 
  cfsqltype="cf_sql_varchar">
  </cfif>
  ORDER By
    CYear DESC
  </cfquery>

挑选
*
从…起
处置
其中1=1
和分区代码=
和地区代码=
和站点代码=
和区域代码=
订购人
CYear DESC

我想到了两个选项:要么让它像include一样工作,要么将其作为函数调用

隔离包括(不太常见) 您的_query.cfm 调用.cfm


这会让您了解您可以实现的目标。

我会查看变量范围和检查,以确保变量存在。让我们看看你的一个条件

<cfif StructKeyExists(url,"DivisionCode") AND url.DivisionCode NEQ "false">
   AND DivisionCode = <cfqueryparam value="#url.DivisionCode#" cfsqltype="cf_sql_varchar">
 </cfif>

和分区代码=
在“DivisionCode”之前添加“url.”前缀将指定要查找变量的范围。这并不能真正帮助您直接解决问题,但它会使您的代码更加清晰,错误消息更加有用

添加StructKeyExists()首先检查以确保URL中的变量可用。根据您编写代码的方式,我猜您不希望通过未包含的URL变量进行过滤,因此这将解决问题


只要对每个cfif执行相同的操作,您就应该是正确的。

如果问题是一个未定义的变量,请查看您认为是在哪里定义的。如果您在这里处理布尔逻辑,我会在尝试将这些变量用于动态SQL之前验证这些变量。另外,在
cfif
中设置变量的范围,并在
cfqueryparam
标记中设置
maxlength
。我从来都不喜欢在查询中直接使用URL或表单范围中的任何内容
cfqueryparam
可以在很大程度上阻止注入,应该绝对使用,但它并不总是阻止一切。正如Dan所说,这些变量是如何传递的?如果在使用它们之前验证它们,请使用
structKeyExists
查看变量是否存在。感谢您的努力。很好的解释。这有助于解决我的问题。
<cfmodule divisionCode="foo" regionCode="bar" variable="my_query" template="your_query.cfm">
<cfdump var="#my_query#">

<!--- or --->

<cfset params = {}>
<cfset params.siteCode = "bla">
<cfif structKeyExists(url, "regionCode")>
    <cfset params.regionCode = url.regionCode>
</cfif>

<cfmodule attributeCollection="#params#" template="your_query.cfm">
<cfdump var="#your_query#">

<!--- etc. --->
<cffunction name="yourQuery" access="public" output="false" returnType="query">

    <!--- declaring possible incoming parameters --->
    <cfargument name="datasource"   type="string" default="dsn">
    <cfargument name="divisionCode" type="string" default="">
    <cfargument name="districtCode" type="string" default="">
    <cfargument name="siteCode"     type="string" default="">
    <cfargument name="regionCode"   type="string" default="">

    <!--- retrieve result (the local. scope makes the variable exist in this function only) --->
    <cfquery name="local.Summary" datasource="#arguments.datasource#">
        SELECT
            *
        FROM
            disposal
        WHERE 1=1

        <cfif len(arguments.divisionCode) gt 0>
            AND DivisionCode = <cfqueryparam value="#arguments.divisionCode#" cfsqltype="cf_sql_varchar">
        </cfif>
        <cfif len(arguments.districtCode) gt 0>
            AND DistrictCode = <cfqueryparam value="#arguments.districtCode#" cfsqltype="cf_sql_varchar">
        </cfif>
        <cfif len(arguments.siteCode) gt 0>
            AND SiteCode = <cfqueryparam value="#arguments.siteCode#" cfsqltype="cf_sql_varchar">
        </cfif>
        <cfif len(arguments.regionCode) gt 0>
            AND RegionCode = <cfqueryparam value="#arguments.regionCode#" cfsqltype="cf_sql_varchar">
        </cfif>

        ORDER BY
            CYear DESC
    </cfquery>

    <!--- return result --->
    <cfreturn local.Summary>
</cffunction>
<cfset my_query = yourQuery("dsn", "foo", "", "bar")>
<cfdump var="#my_query#">

<!--- or --->

<cfset your_query = yourQuery(
    datasource: "dsn",
    siteCode: "bla"
    regionCode: ( structKeyExists(url, "regionCode") ? url.regionCode : "" )
)>
<cfdump var="#your_query#">

<!--- etc. --->
<cfif StructKeyExists(url,"DivisionCode") AND url.DivisionCode NEQ "false">
   AND DivisionCode = <cfqueryparam value="#url.DivisionCode#" cfsqltype="cf_sql_varchar">
 </cfif>