2

制作数组:

<cfset tempArr = DeserializeJSON(URL.data) />
<cfset temp1 = "" />
<cfset temp2 = "" />
<cfset selectList1 = "" />
<cfset selectList2 = "" />

<cfloop array=#tempArr# index="i">
    <cfset temp1 = GetToken(i,1,":")>
    <cfset temp2 = GetToken(i,2,":")>

    <cfset selectList1 = listAppend(selectList1, temp1)>
    <cfset selectList2 = listAppend(selectList2, temp2)>
</cfloop>    

循环遍历它??:

<cfquery name="sample" datasource="database">
    SELECT *
    FROM table
    WHERE 
        <cfloop from="1" to="#listLen(selectList1)#" index="i"/>
        #ListGetAt(selectList1, i)# = <cfqueryparam value="#ListGetAt(selectList2)#" />
    </cfloop>
    <cfif i neq listLen(#selectList1#)>
        AND
    </cfif>
</cfquery>

我的意图是根据从 javascript 页面接收到的数组在表中动态搜索。数据来自于此form -> columnName:searchBy。即,样片将是name:Jim. 我想构建动态代码,允许我按不同的列进行搜索,但我无法让我的循环工作。如果有帮助,我会收到此错误:

(Invalid CFML construct found on line 20 at column 59.)

这是这一行:

<cfloop from="1" to="#listLen(selectList1)#" index="i" />
4

3 回答 3

4

凯尔的回答是 100% 正确的,但这里有一个更好的解决方案。使用列表是一个非常低效的过程(见下文),使用listGetAt只会激怒未来的程序员。您可以使用数组来存放数据并使用默认WHERE语句来简化循环。

<cfset tempArr = DeserializeJSON(URL.data) />
<cfset temp1 = "" />
<cfset temp2 = "" />
<cfset selectList1 = [] />
<cfset selectList2 = [] />

<cfloop array=#tempArr# index="i">
    <cfset temp1 = GetToken(i,1,":")>
    <cfset temp2 = GetToken(i,2,":")>

    <cfset arrayAppend(selectList1, temp1)>
    <cfset arrayAppend(selectList2, temp2)>
</cfloop>  

<cfif NOT arrayIsEmpty(tempArr)>
    <cfquery name="sample" datasource="database">
    SELECT column1, column2, column3
    FROM table
    WHERE 1 = 1
    <cfloop from="1" to="#listLen(selectList1)#" index="i"/>
      AND #selectList1[i]# = <cfqueryparam value="#selectList2[i]#" />
    </cfloop>
    </cfquery>
</cfif>
  • 当您追加到列表时,会在内存中创建一个新字符串,该字符串结合了前两个字符串,并且前一个字符串被删除。这绝对是过早的优化,但避免使用列表仍然是一个好习惯,尤其是当您需要访问其中的元素时。
于 2013-06-07T16:25:20.970 回答
3

我认为您的问题可能是cfloop标签是自动关闭的。试试这个:

<cfloop from="1" to="#listLen(selectList1)#" index="i">

于 2013-06-07T15:25:46.350 回答
1

list属性可以用在<cfloop>.

<cfloop list="#selectList1#" index="i">
    #i# <!--- list element can be processed here with variable name #i# --->
</cfloop>
于 2018-01-26T11:28:02.927 回答