我可以在cfquery中使用cfif吗?

时间:2009-11-09 12:58:37

标签: coldfusion

是否有可能在<cfif>内使用<cfquery>

我在下面的函数中有一个<cfquery>

<cfquery name = "UpdateRecord"   
            dataSource = #arguments.dbSource#   
            username = #arguments.dbUser#   
            password = #arguments.dbPass# 
            result="updateResult" >  
    <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#/cfoutput>
 </cfquery> 

我想检查TimeoutArgument并使其如下所示

<cfquery name = "UpdateRecord"   
                dataSource = #arguments.dbSource#   
                username = #arguments.dbUser#   
                password = #arguments.dbPass# 
                            timeout = #arguments.Timeout#>
                result="updateResult" >  
        <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#/cfoutput>
 </cfquery> 

Timeout是可选参数,如果只传递Timeout,我想像第二个查询那样进行第一次查询。我怎么能这样做?

谢谢,

3 个答案:

答案 0 :(得分:7)

顺便说一下 - 这样的事情有什么意义:

<cfquery 
  name       = "UpdateRecord"   
  dataSource = "#arguments.dbSource#"   
  username   = "#arguments.dbUser#"   
  password   = "#arguments.dbPass#" 
  timeout    = "#arguments.Timeout#"
  result     = "updateResult"
>
  <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#</cfoutput>
</cfquery>

您传入的每一个信息都会产生一个cfquery,包括实际的SQL代码。这没有任何意义,你可以在那里使用cfquery,而不是调用这种过度泛化的函数。它的代码甚至更少。

除此之外,

  • PreserveSingleQuotes(completeSqlString)禁用ColdFusion的任何SQL注入检查,使此函数对滥用和SQL语法错误保持开放状态。
  • 默认情况下,
  • <cfoutput>在CF标记正文中处于启用状态。因此<cfoutput>在上面是多余的。

抽象是好的和一切,但上述是完全没有意义的,而且很危险。

答案 1 :(得分:6)

注意:正如其他人所指出的那样:你几乎肯定做错了,并且最有可能创建一个不安全且效率低下的应用程序,这将是一场噩梦维持。


但是,回答您的具体问题,是的,您可以(间接)使用cfif来控制cfquery属性 - 通过将结构传递给魔术属性AttributeCollection,如下所示:

<cfset var QueryAttributes = StructNew() />

<cfset QueryAttributes.Datasource  = Arguments.dbSource />
<cfset QueryAttributes.Username    = Arguments.dbUser />
<cfset QueryAttributes.Password    = Arguments.dbPass />
<cfif StructKeyExists(Arguments,'Timeout')>
    <cfset QueryAttributes.Timeout = Arguments.Timeout />
</cfif>

<cfquery name="UpdateRecord" result="updateResult"
    AttributeCollection="#QueryAttributes#"
    >
    ...
</cfquery>

(此功能是在CF8中引入的。)

答案 2 :(得分:5)

不,您不能在cfif的属性部分使用cfquery。但是,您可以设置默认值:

<cfargument name="arguments.timeout" default="60" />

然后只使用指定的arguments.timeout查询。默认情况下它将是60秒(或一些理智的值)。如果用户指定了一个值,那么将使用该值。在我看来,这比两个单独的cfquery语句更好。

livedocs for cfargument