是否有可能在<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,我想像第二个查询那样进行第一次查询。我怎么能这样做?
谢谢,
答案 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
语句更好。