【问题标题】:Submit form information with multiple checkboxes/select menus使用多个复选框/选择菜单提交表单信息
【发布时间】:2015-08-26 16:24:40
【问题描述】:

我想知道在用户点击一次提交后,是否有可能让这个小提琴上的表单像这样出现在数据库中。

+------+------+----------+
| Name | Meal | Quantity |
+------+------+----------+
| Adam | Beef |        2 |
| Adam | Pork |        1 |
| Adam | Lamb |        3 |
+------+------+----------+

http://jsfiddle.net/f8zyakvj/1/

我知道通过多选,您选择的所有信息都作为数组发送,但是对于复选框,我怎样才能使信息以类似的方式发送。当我勾选前 3 个框并提醒食物的价值以查看我得到了什么时,无论我勾选哪个框,我得到的都是“1”。

我希望它会像多选一样简单,我可以为 cfm 做这样的事情

<cfloop list="#form.meal#, #form.quantity#" index="currMeal, currQuant">
    <cfquery name="Add" datasource="food"> 
       INSERT INTO Log (Name, Meal, Quantity)
       VALUES ( 
         <cfqueryparam value="#Form.Name#" cfsqltype="cf_sql_varchar">
         <cfqueryparam value="#currMeal#" cfsqltype="cf_sql_varchar">
         <cfqueryparam value="#currQuant#" cfsqltype="cf_sql_integer">
       )
    </cfquery>
</cfloop>

我们将不胜感激。

【问题讨论】:

  • 多选和复选框的行为方式相同。您要么得到一个以逗号分隔的所有选定内容的列表,要么你什么也得不到,甚至没有一个空字符串。当然,这假设您所有的复选框都具有相同的名称。您关于以数组形式发送信息的说法不正确。
  • 你能解释一下它们是如何以同样的方式行事的吗?对于多选菜单,我可以执行类似 alert($('select#meal').val()) 的操作,假设我检查了底部的 3,它会给我一个 2、3、4 的值。当我尝试对复选框做同样的事情,假设 $('input#meal').val() 是正确的,我得到的只是 1 @DanBracuk
  • Dan 正在谈论基本表单 POST(无 javascript)的行为。当您谈论 jQuery javascript 库的行为时。两种完全不同的东西。旁注,我意识到这可能是一个简化的示例,但如果不是……连接表通常存储 id。如果“meal”和/或“name”的来源是另一个 db 表,则应插入 MealID/NameID,并将 cfsqltype 更改为匹配。

标签: javascript html sql-server coldfusion


【解决方案1】:
  1. 您的表单元素没有名称,因此这些值不会发布到您的表单操作页面
  2. 对于您的选择下拉菜单,使用名称来输入与餐点对应的值复选框,以便您轻松查找 - 例如。 &lt;input type="checkbox" value="3" name="meal"&gt; 将与 &lt;select name="quantity_3"&gt; 配对
  3. 您的插入查询缺少逗号,并且会给您一个 SQL 语法错误。

例子:

<form name="form" action="Submit.cfm" method="post">
<input type="checkbox" value="1" name="meal"> Beef
<select name="quantity_1" class="GC0">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select><br>

<input type="checkbox" value="2" name="meal"> Chicken
<select name="quantity_2" class="GC1">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select><br>

<input type="checkbox" value="3" name="meal"> Pork
<select name="quantity_3" class="GC2">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select><br>

<input type="checkbox" value="4" name="meal"> Lamb
<select name="quantity_4" class="GC3">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select><br>

Name: <input type="text" name="name" id="name">
<button value="submit">Submit</button>
</form>

然后在您的处理页面submit.cfm 上,您可以循环遍历 FORM.meal(如果存在)并使用检查的每个项目的值来引用相应的数量字段名称:

<!--- Make sure something was checked before proceeding --->
<cfparam name="FORM.meal" default="" />

<!--- Convert the meal list to an array for looping --->
<cfset mealArray = listToArray(FORM.meal)>

<!--- Loop over the array values --->
<cfloop array="#mealArray#" index="currMeal">
    <!--- Insert into database --->
    <cfquery name="Add" datasource="food">
        INSERT INTO Log (Name, Meal, Quantity)
        VALUES (
            <cfqueryparam value="#FORM.Name#" cfsqltype="cf_sql_varchar">
            ,<cfqueryparam value="#currMeal#" cfsqltype="cf_sql_varchar">
            ,<cfqueryparam value="#FORM['quantity_#currMeal#']#" cfsqltype="cf_sql_integer">
        )
    </cfquery>
</cfloop>

请记住,您应该考虑将数据库插入包装在事务中,和/或考虑批量插入的方法。在循环内查询数据库不被认为是最佳实践。

【讨论】:

  • 好方法。 @khgove - 正如上面提到的 beloitdavisja,您必须将这些相关的插入包装在 transaction 中以确保数据完整性。使用事务,您不必担心只有部分查询会成功。它们将作为一个整体全部成功(或全部失败)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2017-08-03
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2015-11-30
相关资源
最近更新 更多