遍历 cfquery 标签值
Loop over the cfquery tag values
我有以下查询,在其中循环遍历值列表,但在最后一个逗号处出现错误:
<cfquery datasource="#application.dsn#">
INSERT INTO #session.tablename# ( #lFields# )
VALUES (
<cfloop list="#lFields#" index="kk">
<cfqueryparam value="#TRIM(sVideoGame['#kk#'])#" cfsqltype="cf_sql_varchar" null="#NOT LEN(TRIM(sVideoGame['#kk#']))#" />,
</cfloop>
)
</cfquery>
最后一个逗号出现问题。我尝试在 cfloop 之前设置一个计数器,将其设置为 0 并在 cfloop 内部递增到 1。但是,我不确定如何根据某些条件检查删除最后一个逗号。
为了跟踪位置,您需要一个 from/to
循环而不是 list
循环。然后在传递第一个查询参数 后添加一个逗号。
对于 ColdFusion 2016+,可以使用 "item" 和 "index" 属性来完成:
...
<cfloop list="#yourListVariable#" item="keyName" index="position">
<!--- if we've passed the first parameter, add a comma --->
<cfif position gt 1>,</cfif>
<cfqueryparam value="#TRIM(sVideoGame[ keyName ])#"
cfsqltype="cf_sql_varchar"
null="#NOT LEN(sVideoGame[keyName])#" />
</cfloop>
...
CF11 及更早版本需要多做一些工作。为了简化代码,我建议将列表转换为数组:
<cfset keyArray = listToArray(yourListVariable)>
...
<cfloop from="1" to="#arrayLen(keyArray)#" index="position">
<!--- if we've passed the first parameter, add a comma --->
<cfif position gt 1>,</cfif>
<cfqueryparam value="#TRIM(sVideoGame[ keyArray[position] ])#"
cfsqltype="cf_sql_varchar"
null="#NOT LEN(sVideoGame[ keyArray[position] ])#" />
</cfloop>
...
旁注,我注意到查询使用动态 table 和列名。确保这些值不是用户提供的,否则查询容易受到 sql 注入的攻击。
如果您唯一的问题是如何处理最后一个逗号,那么您可以使用
<cfset listCount = 1>
<cfloop list="#lFields#" index="kk">
<cfqueryparam value="#TRIM(sVideoGame['#kk#'])#"
cfsqltype="cf_sql_varchar" null="#NOT LEN(TRIM(sVideoGame['#kk#']))#" />
<cfif listLen(lFields) is not listCount>,</cfif>
<cfset listCount = listCount+1>
</cfloop>
我有以下查询,在其中循环遍历值列表,但在最后一个逗号处出现错误:
<cfquery datasource="#application.dsn#">
INSERT INTO #session.tablename# ( #lFields# )
VALUES (
<cfloop list="#lFields#" index="kk">
<cfqueryparam value="#TRIM(sVideoGame['#kk#'])#" cfsqltype="cf_sql_varchar" null="#NOT LEN(TRIM(sVideoGame['#kk#']))#" />,
</cfloop>
)
</cfquery>
最后一个逗号出现问题。我尝试在 cfloop 之前设置一个计数器,将其设置为 0 并在 cfloop 内部递增到 1。但是,我不确定如何根据某些条件检查删除最后一个逗号。
为了跟踪位置,您需要一个 from/to
循环而不是 list
循环。然后在传递第一个查询参数 后添加一个逗号。
对于 ColdFusion 2016+,可以使用 "item" 和 "index" 属性来完成:
...
<cfloop list="#yourListVariable#" item="keyName" index="position">
<!--- if we've passed the first parameter, add a comma --->
<cfif position gt 1>,</cfif>
<cfqueryparam value="#TRIM(sVideoGame[ keyName ])#"
cfsqltype="cf_sql_varchar"
null="#NOT LEN(sVideoGame[keyName])#" />
</cfloop>
...
CF11 及更早版本需要多做一些工作。为了简化代码,我建议将列表转换为数组:
<cfset keyArray = listToArray(yourListVariable)>
...
<cfloop from="1" to="#arrayLen(keyArray)#" index="position">
<!--- if we've passed the first parameter, add a comma --->
<cfif position gt 1>,</cfif>
<cfqueryparam value="#TRIM(sVideoGame[ keyArray[position] ])#"
cfsqltype="cf_sql_varchar"
null="#NOT LEN(sVideoGame[ keyArray[position] ])#" />
</cfloop>
...
旁注,我注意到查询使用动态 table 和列名。确保这些值不是用户提供的,否则查询容易受到 sql 注入的攻击。
如果您唯一的问题是如何处理最后一个逗号,那么您可以使用
<cfset listCount = 1>
<cfloop list="#lFields#" index="kk">
<cfqueryparam value="#TRIM(sVideoGame['#kk#'])#"
cfsqltype="cf_sql_varchar" null="#NOT LEN(TRIM(sVideoGame['#kk#']))#" />
<cfif listLen(lFields) is not listCount>,</cfif>
<cfset listCount = listCount+1>
</cfloop>