Coldfusion循环

时间:2017-07-04 23:03:09

标签: loops coldfusion cfquery

我需要使用cfloop来插入记录。

这是客户填写的表格。他们从下拉列表中添加项目,然后在文本框中输入数量。通常,数量仅在1到5之间。

我需要运行一个循环来一次插入一个记录,每个记录都有一个唯一的Item ID,每个记录的数量为1.

例如,如果他们添加数量为4的特定项目5,我需要在表格中插入4个记录,每个记录的数量为1。我真正想要的不仅仅是这里的答案,是我如何在不必询问的情况下实现这一目标的思维过程。

3 个答案:

答案 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个项目,它也会快得多。

注意:

  1. 始终清理FORM输入(以及来自任何其他数据) 你以外的其他来源)。 queryparam主要处理SQLi,但可能 允许其他漏洞通过。

  2. 检查您的cfsqltypes是否与之匹配 数据库中列的数据类型。知道哪些有效 一起防止不必要的背景数据转换。 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-p-q/cfqueryparam.html

  3. 尽量减少需要连接的次数 数据库。特别是如果您的应用程序和数据库驻留 不同的服务器(他们应该)。

答案 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>
  1. 这将创建更少的临时变量
  2. 如果你真的在创建一个小的int数量的变量,你就会遇到一个真正的问题。