2012-09-18 25 views
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

複選框更新只是不會提交任何值未選中時(這是它如何工作的)。所以你的查詢應該更接近這個:

UPDATE table SET 
    Meetings = <cfif structKeyExists(FORM, 'Meetings_#i#')>1,<cfelse>0,</cfif> 
WHERE ID = '#an_ID_that_is_specified#' 
+0

YESSSS!我一直在牆上砸了我的頭大約一個小時,這很簡單! –

+1

在CF9中,您可以使用三元語句,因此我建議: 'Meetings = '但它的小變化並不是必須的。 – Dpolehonski

+0

@Dpolehonski看起來不錯!將看看這個,但我可能是懶惰的,而不是打擾:P有很多更新條件,所以可能需要一段時間!感謝您的高擡頭! –

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>