可以<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,我想像第二个查询那样进行第一次查询.我怎样才能做到这一点?
谢谢,
顺便说一下 - 这样的事情有什么意义:
<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>因此在上述冗余.抽象是好的和一切,但上面是完全没有意义的,而且很危险.
注意:正如其他人所指出的那样:你几乎肯定会做错事,并且最有可能创建一个不安全且效率低下的应用程序,这将是一个难以维护的噩梦.
但是,在回答您的具体问题时,您可以(间接)使用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中引入的.)
不,你不能cfif在属性部分使用a cfquery.但是,您可以设置默认值:
<cfargument name="arguments.timeout" default="60" />
Run Code Online (Sandbox Code Playgroud)
然后只需使用arguments.timeout指定的查询.默认情况下它将是60秒(或一些理智的值).如果用户指定了一个值,那么将使用该值.在我看来,这比两个单独的cfquery陈述更好.
| 归档时间: |
|
| 查看次数: |
4165 次 |
| 最近记录: |