多次提交表单信息
Submit form information multiple times
我有一个表格,里面有多个 select 选项。我想这样做,以便当用户点击提交时,它将用所有相关字段填充我的数据库,然后为多个 select 部分进行某种循环。
https://jsfiddle.net/vtyofmza/1/
例如有人突出显示多个 select 中的 3 个字段并输入他们的名字。当他们点击提交时,数据库将填充
李四 - 早餐
李四 - 零食
李四 - 甜点
我在想这样的事情可能会奏效,但它只是重新重置了表单
iSelect = $('#meal').val();
iLength = $('#meal option:selected').length;
for (i = 0; i < iLength; i++){
$('#meal').val(iSelect[i])
document.form.submit();
}
但是当它提交信息时,它返回并重新设置页面。
submit.cfm 看起来像这样
<cfquery name="Add" datasource="food">
INSERT INTO Log (Meal, Name)
VALUES (#Form.Neal#, #Form.Name#)
</cfquery>
<cflocation url="... loops back to original page">
正如@Kevin B 上面所说,这不是 javascript 的工作。任何额外的处理或循环都应该在 ColdFusion 中完成。
基本循环:
多个 select 离子将作为 csv 列表提交,即 form.Meal = "Breakfast,Snacks,Dessert"
。只需循环遍历该列表并为每餐+名称执行插入。有很多方法可以改进这种循环,但下面是基本思想(无验证):
<!--- ensure field always exists --->
<cfparam name="form.Meal" default="">
<!--- loop through the meal list and insert each one individually --->
<cfloop list="#form.Meal#" index="currMealName">
<cfquery name="Add" datasource="food">
INSERT INTO Log (Meal, Name)
VALUES (
<cfqueryparam value="#currMealName#" cfsqltype="cf_sql_varchar">
, <cfqueryparam value="#Form.Name#" cfsqltype="cf_sql_varchar">
)
</cfquery>
</cfloop>
注意:几个重要的注意事项
- 应该将这些相关的查询循环包装在一个 transaction 中以确保数据完整性
- 通常,列表 "value" 是某种数字 ID,而不是文本(如果文本包含列表分隔符,则可能会出现问题)。
更好的选择
如果 select 列表值的来源是另一个数据库 table,另一种方法是使用 SELECT
语句插入值。这具有内置验证的优势,并且还将所有值插入单个查询中。就个人而言,我更喜欢这种方法而不是循环。出于演示目的,示例使用 type=cf_sql_varchar。显然根据需要更新类型以匹配您的实际列。
INSERT INTO Log (Meal, Name)
SELECT Meal
, <cfqueryparam value="#form.name#" cfsqltype="cf_sql_varchar">
FROM YourMealTable
WHERE Meal IN
(
<cfqueryparam value="#form.meal#" list="true" cfsqltype="cf_sql_varchar">
)
我有一个表格,里面有多个 select 选项。我想这样做,以便当用户点击提交时,它将用所有相关字段填充我的数据库,然后为多个 select 部分进行某种循环。
https://jsfiddle.net/vtyofmza/1/
例如有人突出显示多个 select 中的 3 个字段并输入他们的名字。当他们点击提交时,数据库将填充
李四 - 早餐
李四 - 零食
李四 - 甜点
我在想这样的事情可能会奏效,但它只是重新重置了表单
iSelect = $('#meal').val();
iLength = $('#meal option:selected').length;
for (i = 0; i < iLength; i++){
$('#meal').val(iSelect[i])
document.form.submit();
}
但是当它提交信息时,它返回并重新设置页面。
submit.cfm 看起来像这样
<cfquery name="Add" datasource="food">
INSERT INTO Log (Meal, Name)
VALUES (#Form.Neal#, #Form.Name#)
</cfquery>
<cflocation url="... loops back to original page">
正如@Kevin B 上面所说,这不是 javascript 的工作。任何额外的处理或循环都应该在 ColdFusion 中完成。
基本循环:
多个 select 离子将作为 csv 列表提交,即 form.Meal = "Breakfast,Snacks,Dessert"
。只需循环遍历该列表并为每餐+名称执行插入。有很多方法可以改进这种循环,但下面是基本思想(无验证):
<!--- ensure field always exists --->
<cfparam name="form.Meal" default="">
<!--- loop through the meal list and insert each one individually --->
<cfloop list="#form.Meal#" index="currMealName">
<cfquery name="Add" datasource="food">
INSERT INTO Log (Meal, Name)
VALUES (
<cfqueryparam value="#currMealName#" cfsqltype="cf_sql_varchar">
, <cfqueryparam value="#Form.Name#" cfsqltype="cf_sql_varchar">
)
</cfquery>
</cfloop>
注意:几个重要的注意事项
- 应该将这些相关的查询循环包装在一个 transaction 中以确保数据完整性
- 通常,列表 "value" 是某种数字 ID,而不是文本(如果文本包含列表分隔符,则可能会出现问题)。
更好的选择
如果 select 列表值的来源是另一个数据库 table,另一种方法是使用 SELECT
语句插入值。这具有内置验证的优势,并且还将所有值插入单个查询中。就个人而言,我更喜欢这种方法而不是循环。出于演示目的,示例使用 type=cf_sql_varchar。显然根据需要更新类型以匹配您的实际列。
INSERT INTO Log (Meal, Name)
SELECT Meal
, <cfqueryparam value="#form.name#" cfsqltype="cf_sql_varchar">
FROM YourMealTable
WHERE Meal IN
(
<cfqueryparam value="#form.meal#" list="true" cfsqltype="cf_sql_varchar">
)