Цикл по значениям тега 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 и увеличивая до 1 внутри cfloop. Тем не менее, я не уверен, как удалить последнюю запятую на основе проверки некоторых условий.

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.

Если ваш единственный вопрос заключается в том, как бороться с последней запятой, то вы можете сделать это с

<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>
Другие вопросы по тегам