2015-08-26 99 views
1

我想知道在用戶點擊提交一次後,這個提琴上的表單是否可以像這樣出現在數據庫中。用多個複選框/選擇菜單提交表單信息

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

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

我知道,通過多方選擇,您選擇的所有信息是通過一個數組發送,但對於複選框,我怎樣才能讓這個信息被以類似的方式發送。當我檢查前三箱時,提醒食物的價值以瞭解我得到的結果,無論我檢查哪個盒子,我得到的所有東西都是「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> 

在這個問題上的任何幫助將不勝感激做這樣的事情。

+1

多重選擇和複選框的行爲方式相同。你可以得到一個逗號分隔的所有選中的列表,或者你什麼也沒有,甚至沒有空字符串。當然,這是假設您的所有複選框都具有相同的名稱。關於作爲數組發送的信息的陳述不正確。 –

+0

你能解釋他們如何以相同的方式行事?對於多選菜單,我可以做一些類似alert($('select#meal')。val())的事情,假設我檢查底部3,它會給我一個值2,3,4。當我嘗試假設$('input#meal')。val()是正確的,我得到的是1 @DanBracuk – khgove

+0

Dan正在討論基本表單POST(無javascript)的行爲。當你談論的jQuery JavaScript庫的行爲。兩件完全不同的事情。注意,我意識到這可能是一個簡化的例子,但如果它不是......聯結表通常存儲id的。如果「用餐」和/或「名稱」的來源是另一個數據庫表,則應該插入MealID/NameID,然後更改cfsqltype以匹配。 – Leigh

回答

2
  1. 你的表單元素沒有名字,所以值不會被張貼到你的表單操作頁面
  2. 爲您選擇下拉菜單,使用名稱把相當於一頓複選框,以便您的值可以很容易地查找它 - 例如<input type="checkbox" value="3" name="meal">將與<select name="quantity_3">配對
  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> 

請記住,您應該考慮將數據庫插入包裝在交易中,和/或考慮批量插入的方法。在循環中查詢數據庫不被認爲是最佳實踐。

+1

好方法。 @khgove - 如上所述,您必須*將這些相關插入內容封裝在[transaction](https://en.wikipedia.org/wiki/ACID)中以確保數據的完整性。通過事務處理,您不必擔心只有部分查詢會成功。他們將*全部*作爲一個單元成功(或全部失敗)。 – Leigh