我正在创建一个新表单,我想我会把jQuery的serialize()带出来。这是一个全新的形式,所以我还没有锁定表单字段名称(所有绿地工作)。
我可以选择使用任一数据集(密切关注等号 - 此输出不是拼写错误):
data=userId=99&firstName=John&lastName=Doe&interestName=2&interestName=8&sdf&interestName=5
或data=userId=99&firstName=John&lastName=Doe&interestName_1=2&interestName_2=8&sdf&interestName_3=5
我目前的解决方案并不漂亮,条件逻辑也不容易维护。现在我已经解释了我的循环,这里是一个很难看的代码:
<cfoutput>
<cfloop list="#url.data#" index="i" delimiters="&">
<cfset key = listfirst(i,'=')>
<cfset keyValue = listlast(i,'=')>
<cfif key eq 'userId'>
<cfset userId = keyValue>
</cfif>
<cfif key contains 'interestName_'>
<cfquery name="rsInsert" datasource="playground">
insert into table (optionId,userId)
values
(#keyValue#,#userid#)
</cfquery>
</cfif>
</cfloop>
</cfoutput>
有哪些选项可以提高效率?
答案 0 :(得分:1)
如果可能的话,在任何编程语言中都应该总是避免对循环的每次迭代执行db操作。在这种情况下,您可以将循环移动到<cfquery>
内部并执行多重插入。您还可以通过在循环外部移动INSERT INTO (...)
部分来进一步减小查询的大小,具体取决于数据库支持。这当然取决于数据源设置中允许的多插入。
<cfquery name="rsInsert" datasource="playground">
<cfloop list="#url.data#" index="i" delimiters="&">
<cfset key = listfirst(i,'=')>
<cfset keyValue = listlast(i,'=')>
<cfif key eq 'userId'>
<cfset userId = keyValue>
</cfif>
<cfif key contains 'interestName_'>
insert into table (optionId,userId)
values
(#keyValue#,#userid#);
</cfif>
</cfloop>
</cfquery>
不要忘记阻止sql注入。