我需要使用cfloop
来插入记录。
这是客户填写的表格。他们从下拉列表中添加项目,然后在文本框中输入数量。通常,数量仅在1到5之间。
我需要运行一个循环来一次插入一个记录,每个记录都有一个唯一的Item ID,每个记录的数量为1.
例如,如果他们添加数量为4的特定项目5,我需要在表格中插入4个记录,每个记录的数量为1。我真正想要的不仅仅是这里的答案,是我如何在不必询问的情况下实现这一目标的思维过程。
答案 0 :(得分:1)
那是......记录事物的奇怪方式,但还好。
我将假设表单字段的名称是ITEM和QUANTITY。我也假设您使用的是SQL或MySQL。两者的代码几乎相同。
以下是您的操作页面上的代码:
<cfloop from="1" to="#FORM.QUANTITY#" index="i">
<cfquery name="insertOrder" datasource="DSN">
INSERT INTO TABLENAME
(
ITEMCOLUMN,
QTYCOLUMN
)
VALUES
(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.ITEM#">,
1
)
</cfquery>
</cfloop>
我添加了cfqueryparam
标记来声明数据类型并帮助防止SQL注入。我实际上并不知道您的数据类型是什么,但您绝对应该考虑将其用于从FORM或URL范围获取内容的任何查询。
答案 1 :(得分:1)
您使用的是哪种SQL?您可以执行以下操作,而不是为每个项目建立数据库连接并插入一次:
<<<< sanitize FORM inputs >>>>
<cfquery name="insertRecords" datasource="#APPLICATION.DSN#">
INSERT INTO <TheTable> ( ItemID, Qty, <OtherDetails> )
VALUES
<cfloop from="1" to="#sanitizedFORMQuantity# index="i">
(
<cfqueryparam cfsqltype="cf_sql_integer" value="#sanitizedItemID#">
, 1
, <cfqueryparam cfsqltype="cf_sql_varchar" value="#sanitizedOtherDetails#">
)
<cfif index NEQ sanitizedFORMQuantity>,</cfif>
</cfloop>
</cfquery>
这使您可以构建查询并执行单个INSERT,只与数据库建立一个连接。即使只有5个项目,它也会快得多。
注意:
始终清理FORM输入(以及来自任何其他数据) 你以外的其他来源)。 queryparam主要处理SQLi,但可能 允许其他漏洞通过。
检查您的cfsqltypes是否与之匹配 数据库中列的数据类型。知道哪些有效 一起防止不必要的背景数据转换。 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-p-q/cfqueryparam.html
尽量减少需要连接的次数 数据库。特别是如果您的应用程序和数据库驻留 不同的服务器(他们应该)。
答案 2 :(得分:0)
对Shawn的优秀答案的微小改动
<cfquery name="insertRecords" datasource="#APPLICATION.DSN#">
DECLARE @OtherDetails varchar(80) = <cfqueryparam cfsqltype="cf_sql_varchar" value="#sanitizedOtherDetails#">
INSERT INTO <TheTable> ( ItemID, Qty, <OtherDetails> )
VALUES
<cfloop from="1" to="#sanitizedFORMQuantity# index="i">
(
<cfqueryparam cfsqltype="cf_sql_smallint" value="#sanitizedItemID#">
, 1
, @otherDetails
)
<cfif index NEQ sanitizedFORMQuantity>,</cfif>
</cfloop>
</cfquery>