循环遍历cfquery标记值

时间:2017-04-19 18:07:24

标签: coldfusion cfquery

我有以下查询,我循环遍历值列表但我在最后一个逗号时收到错误:

<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。但是,我不知道如何基于某些条件检查删除最后一个逗号。

2 个答案:

答案 0 :(得分:2)

为了跟踪位置,您需要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>
...

旁注,我注意到查询使用动态表和列名称。确保这些值不是用户提供的,或者查询易受sql注入攻击。

答案 1 :(得分:0)

如果你唯一的问题是如何处理最后一个逗号,那么你可以用

来完成
<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>