我有生成的动态复选框
<cfset counter = 0>
<form name="setPermissions" class="setPermissions" action="" method="post">
<cfoutput>
<cfloop query="getUserAccess">
<input name="Meetings_#Counter#" type="checkbox" />
<cfset counter = counter + 1>
</cfloop>
</cfoutput>
</form>
getUserAccess
查询有6行,这意味着将输出其中6个复选框。
要阅读这些内容并分别更新表格,我正在运行以下查询
<cfloop from="0" to="#getUserAccess.RecordCount#" index="i">
<cfquery datasource="#Request.dsn#">
UPDATE table SET
<cfif structKeyExists(FORM, 'Meetings_#i#')>
Meetings = <cfif FORM['Meetings_#i#'] EQ "on">1,<cfelse>0,</cfif>
</cfif>
WHERE ID = '#an_ID_that_is_specified#'
</cfquery>
</cfloop>
如果这段代码不正确,它会在我在我的页面上运行它时起作用,但是生成了大约20个这样的复选框,所以我已经剪断了我的代码,所以你只能看到一个。< / p>
现在,这段代码效果很好,当我选中一个框并提交表单时,此代码将更新数据库以将值设置为1.
唯一的问题是,当我取消选中该框时,它不会将值更改为0.这就是我被卡住的地方。当没有将on
指定为表单值时,为什么不将值更改为0?
我已经完成<cfdump>
以查看是否仍有任何内容通过,但没有。
勾选所有方框后,我得到了这个转储
MEETINGS_0 on
MEETINGS_1 on
MEETINGS_2 on
MEETINGS_3 on
MEETINGS_4 on
MEETINGS_5 on
如果勾选了一些,我没有勾选的那些没有显示出来。
但是,该值仍未从1更新为0。
答案 0 :(得分:4)
复选框在取消选中时不会提交任何值(这就是它的工作方式)。因此,您的查询应该更接近于此:
UPDATE table SET
Meetings = <cfif structKeyExists(FORM, 'Meetings_#i#')>1,<cfelse>0,</cfif>
WHERE ID = '#an_ID_that_is_specified#'
答案 1 :(得分:0)
Sergii已经回答了原来的问题。但只是抛出另一种方法......
您也可以使用列表。假设您的id是数字,请为所有复选框指定相同的名称,并将原始ID存储在隐藏字段中。
<cfoutput query="getUserAccess">
#meetingID#
<input name="SelectedMeetings" type="checkbox" value="#meetingID#" />
</cfoutput>
<cfoutput>
<input name="OriginalMeetings" type="hidden" value="#valueList(getUserAccess.meetingID)#" />
</cfoutput>
在操作页面FORM.SelectedMeetings
将包含所选ID的列表。只需取两个列表的差异即可找到“取消选择”的ID。
<cfparam name="FORM.SelectedMeetings" default="" / >
<cfset FORM.DeSelectedMeetings = replaceList( FORM.OriginalMeetings
, FORM.SelectedMeetings
, "") />
然后,您只需要两个查询来更新数据库而不是六个(或者您拥有多少个复选框)。显然,无论选择哪种方法,都应该在事务中包装所有查询,以确保它们一起成功或失败。
<cfif listLen(trim(FORM.selectedMeetings))>
<cfquery datasource="#Request.dsn#">
UPDATE table
SET Meetings = 1
WHERE ID IN (
<cfqueryparam value="#FORM.selectedMeetings#" list="true" cfsqltype="cf_sql_integer">
)
</cfquery>
</cfif>
<cfif listLen(trim(FORM.DeSelectedMeetings))>
<cfquery datasource="#Request.dsn#">
UPDATE table
SET Meetings = 0
WHERE ID IN (
<cfqueryparam value="#FORM.DeSelectedMeetings#" list="true" cfsqltype="cf_sql_integer">
)
</cfquery>
</cfif>