遇到了一个问题,我想我可能会看到是否有人对如何修复它有任何想法。
基本上,我在单个变量下传递多个值,我想使用循环来提取每个单独的值并同时插入它。
例如,缺血是我用来传递设备值的变量。如果我要选择两个设备,按下提交并在我的处理页面中转储变量#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而不是设备测试(因为索引),但我不能为我的生活弄清楚如何通过在值中,以便它逐个挑选每一个。
我已经看到一些例子,其中人们已经使用值附加了索引(i),然后使用它来插入,但是并不真正理解它将如何工作。
谢谢, 约旦
答案 0 :(得分:6)
我认为你这很复杂。以下内容将用于遍历表单变量中的列表。
<!--- 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)
我不明白deviceArray
的含义是什么。你说form.isChecked
已经是一个包含设备ID列表的列表。如果它是从表单提交中提交的,则它已经以逗号分隔。
因此,除了listlen
之外,没有必要做任何事情来获得它的长度。
您的代码可能不在上下文中,但要完整,请确保param
form.isChecked
和form.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>
没有必要为每个循环实际编写单独的插入。大多数数据库允许您使用一个语句插入多行。由于您只是循环遍历form.userID
和form.isChecked
中的每个值,因此您只需执行listGetAt
- 确保使用cfqueryparam
来清理数据输入。请注意,我假设您的deviceId
和userId
值是整数。根据需要更改。
<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>