0

我有这样生成的动态复选框

  <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 个这样的复选框,所以我剪掉了我的代码,所以你只能看到一个。

现在,这段代码工作得很好,当我选中一个框并提交表单时,这段代码将更新数据库以将值设置为 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。

4

2 回答 2

4

复选框在未选中时根本不会提交任何值(这就是它的工作原理)。所以你的查询应该更接近这个:

UPDATE table SET 
    Meetings = <cfif structKeyExists(FORM, 'Meetings_#i#')>1,<cfelse>0,</cfif>
WHERE ID = '#an_ID_that_is_specified#'
于 2012-09-18T11:15:30.237 回答
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>
于 2012-09-20T17:05:09.903 回答