验证动态复选框

Validate dynamic checkbox

我在数据库中有两个 table,Table A 和 Table B。用户填写表格 A,将在 Table A 中插入新记录。在表单 B 中,Table A 中的记录称为复选框。从此表单中,数据将被插入到 Table B 中。以下代码在表单 B 中。此代码中捕获的数据将被插入到列中(假设列名是 menu_check),结果类似于 "value1,value2,value3"(取决于用户选中的复选框数量)

<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"   />#qMenu.menu_name_eng#

表单 B 完成后,用户将被定向到一个页面,其中显示了 Table B 中所有记录的列表。用户可以从此 table 编辑任何记录。类似于一个简单的列表,用户可以在其中查看、更新或删除任何记录。在编辑页面中,如何调出menu_check的值,并根据该列查看是否选中了任何复选框。

例如:

我尝试使用定界符,但仍然无法理解,因为我不知道之后该从哪里继续。

<cfloop delimiter="," index="a" list="#queryname.menu_check#"></cfloop>

我尝试使用类似的东西;

<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#" <cfif "#queryname.menu_check#" EQ "#qMenu.menu_id#">selected</cfif> /> #qMenu.menu_name_eng#

但这也没有用。我正在使用 ColdFusion9。

要选中 input[type=checkbox],您需要使用 checked 而不是 selected

由于 queryname.menu_check 的值,您可以使用 listFind(list, value [, delimiters, includeEmptyValues]) 函数检查 queryname.menu_check.

中是否存在该值
<cfset checkedstatus = "">
<cfif ListFind(queryname.menu_check, qMenu.menu_id)>
  <cfset checkedstatus = " checked">
</cfif>
<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"#checkedstatus#/> #qMenu.menu_name_eng#

在循环中

<cfoutput query="qMenu">
  <cfset checkedstatus = "">
  <cfif ListFind(queryname.menu_check, qMenu.menu_id)>
    <cfset checkedstatus = " checked">
  </cfif>
  <input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"#checkedstatus#/> #qMenu.menu_name_eng#
</cfoutput>

扩展 , lists (and list functions) certainly help. However, I wouldn't recommend actually storing data in the database that way. Instead, use a junction or bridge table,它提供了比列表更大的灵活性和性能。

Sample Table Structure

  • 用户 - Table 个独立用户
  • 菜单 - Table 个独特的菜单选项
  • UserMenu - Table 每个用户的选定菜单选项

注意,连接点 table 将每个选择存储为单独的行。这样您就可以根据需要存储尽可能少或尽可能多的选择,并轻松更改它们。

使用该结构,编辑页面仅检索当前用户的选定选项并将这些值转换为列表。

 <cfquery name="qSelectedOptions" ...>
     SELECT MenuId
     FROM   UserMenu 
     WHERE  UserId = <cfqueryparam value="#form.currentUserID#" .... >
 </cfquery>

 <cfset selectedOptions = valueList(qSelectedOptions.MenuId)>

然后在生成复选框的循环内,一个简单的列表函数确定是否应选中每个框:

 <cfquery name="qMenu" ...>
     SELECT MenuId, MenuName
     FROM   Menu
     ORDER BY MenuName
 </cfquery>

 <cfoutput query="qMenu">
     #MenuName# 
     <input type="checkbox" name="menuOptions" value="#MenuId#" 
         <cfif listFind(selectedOptions, menuId)>checked</cfif>>
 </cfoutput>

最后,要将选择保存到数据库,首先删除现有值,然后插入任何新值。

   <cftransaction>
       <cfquery ....>
         DELETE FROM UserMenu 
         WHERE  UserId = <cfqueryparam value="#form.currentUserID#" cfsqltype="...">
       </cfquery ....>
       <cfquery ....>
          INSERT INTO UserMenu (UserID, MenuID)
          SELECT <cfqueryparam value="#form.currentUserID#" cfsqltype="...">
                     , MenuId
          FROM   Menu
          WHERE  MenuId IN (
             <cfqueryparam value="#form.menuOptions#" list cfsqltype="...">

          )
       </cfquery>
    </cftransaction>

我已经设法解决了这个问题。我正在使用 CONTAIN 检查数据库中是否存在该值。我的代码行;

<input type="checkbox" name="chckmenu" id="chckmenu" value="#qMenu.menu_id#"  
<cfif qSubCheck.con_check CONTAINS #qMenu.menu_id#>Checked</cfif>
/>#qMenu.menu_name_eng#

谢谢大家的帮助!