我可以在cfquery中使用cfif吗?

CFU*_*ser 1 coldfusion

可以<cfif>在里面使用<cfquery>吗?

我有一个<cfquery>像下面这样的函数

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

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

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

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

谢谢,

Tom*_*lak 7

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

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

您正在传递生成cfquery的每一小部分信息,包括实际的SQL代码.这没有任何意义,你可以在那里使用cfquery,而不是调用这种过度泛化的函数.它甚至会减少代码.

除此之外,

  • PreserveSingleQuotes(completeSqlString) 禁用ColdFusion的任何SQL注入检查,将此函数全部打开以防止滥用和SQL语法错误.
  • <cfoutput>默认情况下在CF标签主体中打开.的<cfoutput>因此在上述冗余.

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

  • 我同意,如果与任何用户输入一起使用,这是危险的.不过,我之前已经看过它从cfscript调用查询. (2认同)
  • 看看你对你的要求的不灵活性以及你提到的关于超时的另一个要求......我开始担心这个查询是一个Web服务的核心,其他一些服务正在远程调用来查询你的数据库.请告诉我事实并非如此. (2认同)

Pet*_*ton 6

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


但是,在回答您的具体问题时,您可以(间接)使用cfif控制cfquery属性 - 通过将结构传递给magic属性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>
Run Code Online (Sandbox Code Playgroud)

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


Rya*_*rle 5

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

<cfargument name="arguments.timeout" default="60" />
Run Code Online (Sandbox Code Playgroud)

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

为cfargument LiveDocs中.