为什么CFML一直试图分配而不是输出我的变量?

时间:2017-02-09 00:20:11

标签: coldfusion lucee

我正在尝试转换数据库列名列表并在查询中进行检查。例如,这个列表:

<cfset permissionsLevelList = 'blnGalleryAdd,blnGalleryUpdate,blnGalleryDelete,blnGalleryMaster'>

这不是以任何方式通过UI传递的。

所以,然后我将它转换为数组并尝试在我的查询中循环它

<cfset permissionsLevelArray = listToArray(permissionsLevelList)>
AND (
    <cfloop array="#permissionsLevelArray#" index="i">
        ap.#permissionsLevelArray[i]# = 1 
        <cfif i neq arrayLen(permissionsLevelArray)>OR</cfif>
    </cfloop>
)

但是我得到的错误不能

cast [blnGalleryAdd] string to a number value

因此,当我只想输出它时,编译器会尝试将其指定为变量。

有没有人知道这方面有什么好的解决方法?

3 个答案:

答案 0 :(得分:7)

这个documentation告诉我,当循环遍历数组时,index属性表示数组元素,而不是该元素的位置。您的错误消息强化了这一点。

你所要做的就是改变这一点:

<cfloop array="#permissionsLevelArray#" index="i">
    ap.#permissionsLevelArray[i]# = 1 

到这个

<cfloop array="#permissionsLevelArray#" index="i">
    ap.#i# = 1 

与您的问题无关,但您并非真的需要这个:

<cfif i neq arrayLen(permissionsLevelArray)>OR</cfif>

由于您使用or逻辑,您可以使用不等式开始或完成该块,并在每次迭代时将单词or放入循环中。像这样:

and
(1 = 2
<cfloop>
or
this = that
</cfloop>
)

答案 1 :(得分:1)

这最终起作用了:

<cfset realIndex = 1>
<cfloop array="#permissionsLevelArray#" index="i">
    ap.#i# #chr(61)# 1
    <cfif realIndex neq arrayLen(permissionsLevelArray)>OR</cfif>
    <cfset realIndex++>
</cfloop>

答案 2 :(得分:1)

AND (
  <cfscript>
  permissionsLevelArray = listToArray(permissionsLevelList);
  for ( i = 1; i LTE ArrayLen( permissionsLevelArray ); i++ )
  {
    WriteOutput( (i>1?" OR ":"") & "ap." & permissionsLevelArray[i] & " = 1" ); 
  }
  </cfscript>
)