Coldfusion SQL插入循环

Coldfusion SQL Insert Loop

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

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

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

如果重要的话,这都是在cfc中完成的。

1
2
3
4
5
        <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.

我用这个来找出插入循环应该有多长。
我原本也可以检查数组的长度,但我也会将该列表用于其他目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <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而不是设备测试(因为索引),但我不能为我的生活找出如何传递值这样它就可以单独挑出每一个。

我已经看到一些例子,其中人们已经使用值附加了索引(i),然后使用它来插入,但是并不真正理解它将如何工作。

谢谢,
约旦


我觉得你这很复杂了。下面将循环遍历表单变量中的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--- 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>


我不明白deviceArray的意义。你说form.isChecked已经是一个包含设备ID列表的列表。如果它是从表单提交进来的,则它已经以逗号分隔。

因此,除了listlen之外,没有必要做任何事情来获得它的长度。

您的代码可能会脱离上下文,但要完成,请确保param form.isCheckedform.userID

1
2
<cfparam name="form.isChecked" DEFAULT="">
<cfparam name="form.userID" DEFAULT="">

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>