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> |
我不明白
因此,除了
您的代码可能会脱离上下文,但要完成,请确保
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> |
没有必要为每个循环实际编写单独的插入。大多数数据库允许您使用一个语句插入多行。由于您只是循环遍历
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> |