去年,我发布了一个问题here关于提交一个50字段的表单,以及最好的方法来做到这一点。该解决方案仍在使用中,运行良好。然而,为了构建这些动态查询,我最终得到了很多重复的<cfif>
,我想知道是否有更好的方法来处理这个问题。虽然代码结束了“杂乱”,但由于这一点,db当然非常干净,并且写入次数也保持在最低限度,但有没有更好的方法来执行以下操作?将大型表格保存到多个表格,规范化和动态查询
<cfif StructKeyExists(arguments.form,"data1") or StructKeyExists(arguments.form,"data2") or StructKeyExists(arguments.form,"data3")>
<cfquery>
insert into table1 (
<cfif StructKeyExists(arguments.form,"data1")>data1,</cfif>
<cfif StructKeyExists(arguments.form,"data2")>data2,</cfif>
<cfif StructKeyExists(arguments.form,"data3")>data3,</cfif>
userid
)
values (
<cfif StructKeyExists(arguments.form,"data1")><cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.form.data1#" maxlength="30">,</cfif>
<cfif StructKeyExists(arguments.form,"data2")><cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.form.data2#" maxlength="10">,</cfif>
<cfif StructKeyExists(arguments.form,"data3")><cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.form.data3#" maxlength="25">,</cfif>
<cfqueryparam cfsqltype="cf_sql_smallint" value="#arguments.form.userid#" maxlength="5">
)
on duplicate key update
<cfif StructKeyExists(arguments.form,"data1")>data1=values(data1),</cfif>
<cfif StructKeyExists(arguments.form,"data2")>data2=values(data2),</cfif>
<cfif StructKeyExists(arguments.form,"data3")>data3=values(data3),</cfif>
userid=values(userid)
</cfquery>
</cfif>
这种'感觉'出于某种原因是错误的。难道例如更加聪明,能,而有更多的写操作,每个值分割到自己的更新,就像这样:
<cfif StructKeyExists(arguments.form,"data1")>
<cfquery>
insert into table1 (data1,userid)
values (<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.form.data1#" maxlength="30">,<cfqueryparam cfsqltype="cf_sql_smallint" value="#arguments.form.userid#" maxlength="5">)
on duplicate key update data1=values(data1),userid=values(userid)
</cfquery>
</cfif>
等
还是有更好的方式来做到这一点,我完全可以俯瞰?!
对不起,我本来应该更清晰,但它不是很*是*一致。我重写了这个问题的命名,但它更像arguments.form.departure_date/arguments.form.staffid/arguments.form.otherinfo等。我可以循环arguments.form我假设,但值进入不同的表( staffid进入表2,其他信息进入表3等),并且没有自动的方式知道哪个值在哪个表中。 – sckd
_“有没有自动的方式知道”_ - 所以使用手动方式;每个表都有一个数组,它可以接收可能的字段,并循环这些数据。 –
好吧,我循环遍历arguments.form,然后使用一堆包含每个表的字段以及cfqueryparam的sql类型和maxlength的数组来匹配更新的字段,然后对每个更改执行一次插入/更新?这肯定会让代码更加干净!因此,就我原来的问题而言,在一次写入可能包含多个值的情况下,最终还会产生大量单写操作?感谢所有的建议;绝对在这里学习很多! – sckd