3

遇到一个问题,我想我可能会看看是否有人对如何解决它有任何想法。

基本上,我在一个奇异变量下传入多个值,我想使用循环来提取每个单独的值并同时插入它。

例如,ischecked 是我用来传递设备值的变量。如果我要选择两个设备,按提交并在我的处理页面中转储变量#form.ischecked#,我会得到一个值,例如 41,42。我需要一种方法来拆分这些值,并认为 cfloop 和 insert 将是完美的。

如果这很重要,这一切都在 cfc 中完成。

        <cfset devicearray = ArrayNew(1)>
        <cfset temp = ArrayAppend(devicearray, #ischecked#)>
        <cfset test = ArrayToList(devicearray, ",")>
        <cfset length= ListLen(test)>\
        \\this loop takes the amount of devices selected, and outputs the length of the list. 

我用它来找出插入循环应该持续多长时间。我本来也可以只检查数组的长度,但我也打算将该列表用于其他目的。

    <cfset devicetest = #form.ischecked#>

        <cfset usertest = #form.userid#>

        \\form.ischecked is the variable that contains the device IDs

        \\form.userid is the variable that contains the User IDs

        <cfquery name="loopquery" datasource="Test">
        <cfloop from="1" to="#length#" index="i">

        \\loop from 1 to "length", the number of Devices selected as specified earlier

        INSERT INTO Loan (DeviceID, UserID)
        VALUES ("#Evaluate("devicetest#i#")#","#Evaluate("userID#i#")#" )
        </cfloop>
        </cfquery>

所以基本上这就是我坚持的地方,循环遍历值,但它寻找 devicetest1 而不是 device test (因为索引),但我无法终生弄清楚如何传递值以便它单独挑选出每一个。

我见过一些例子,人们在索引 (i) 中附加了值,然后用它来插入,但并没有真正理解它是如何工作的。

谢谢,乔丹

4

2 回答 2

7

我认为您使这件事复杂化了很多。下面将循环遍历表单变量中的列表。

<!--- dummy data --->
<cfset form.userid = 75>
<cfset form.ischecked = '46,47'>

<cfloop list="#form.ischecked#" index="i">  
 <cfquery name="loopquery" datasource="Test">
 INSERT INTO Loan (DeviceID, UserID)
 VALUES (
    <cfqueryparam cfsqltype="cf_sql_integer" value="#i#">,
    <cfqueryparam cfsqltype="cf_sql_integer" value="#form.userid#">
    )
 </cfquery>
</cfloop>
于 2012-12-04T20:38:25.607 回答
2

我不明白这是什么意思deviceArray。您说form.isChecked的已经是一个包含设备 ID 列表的列表。如果它来自表单提交,则它已经用逗号分隔。

listlen因此,除了 a来获取它的长度之外,没有真正需要做任何事情。

您的代码可能会断章取义,但要完整,请确保您param form.isCheckedform.userID

<cfparam name="form.isChecked" default="">
<cfparam name="form.userID" default="">

此时,我也会亲自做一些错误检查,以确保两个变量的长度匹配。

<cfif listLen(form.isChecked) NEQ listLen(form.userID)>
    <!--- abort or do something else --->
</cfif>

实际上不需要为每个循环编写单独的插入。大多数数据库将允许您使用一条语句插入多行。由于您只是循环遍历 and 中的每个值form.userID,因此form.isChecked您只需执行 a listGetAt- 确保使用 acfqueryparam来清理您的数据输入。请注意,我只是假设您的deviceIduserId值是整数。根据需要更改这些。

<cfquery name="insert" datasource="test">
    INSERT INTO Loan (DeviceID, UserID)
    VALUES
    <cfloop from="1" to="#listLen(form.userID)#" index="i">
       <cfif i GT 1>
           ,
       </cfif>
       (
           <cfqueryparam value="#listGetAt(form.isChecked,i)#" cfsqltype="CF_SQL_INTEGER">,
           <cfqueryparam value="#listGetAt(form.userID,i)#" cfsqltype="CF_SQL_INTEGER">
       )
    </cfloop>
</cfquery>
于 2012-12-04T20:36:46.067 回答