Coldfusion复杂构造

时间:2018-04-13 13:20:53

标签: coldfusion conditional coldfusion-2016 cfloop

我正在尝试构建一个coldfusion条件语句,用于查找已选中的增量表单ID复选框。所有复选框都定义为组件[组件编号]。我已经建立了一个循环,它正在寻找一个URL变量,该变量对于调用条件的每个表单都是不同的,如下所示。我遇到的问题是我在执行时收到错误,告诉我“复杂的构造不支持函数参数化。

显然,它与参数化学家声明的动态性质有关,但我不完全知道这意味着什么。任何人都可以解释这个并提供解决方案吗?我对coldfusion和编码很新,所以请放轻松。

<cfloop from="1" to="#URL.loopcounter#" index="loopvar">

<cfif parameterexists(Form.Component#loopvar#)>

    INSERT INTO Results (MP_Barcode, Reworked, Reworked_By)
    VALUES ('#Form.MontaplastBarcode#', 'YES', '#URL.BadgeNumber#')

</cfloop>

    <cfoutput>
        <p class="success">YOUR REWORK HAS BEEN SUBMITTED SUCCESSFULLY.</p>
    </cfoutput>
<cfelse>
        <p class="error">NO REWORK WAS SUBMITTED. NO COMPONENTS SELECTED.</p>
</cfif>

根据调用此操作的表单,URL loopcounter变量的范围为1到50。

2 个答案:

答案 0 :(得分:2)

要回答这个问题,有几个ColdFusion函数不允许您在函数评估之前创建动态名称。 parameterExists()就是其中之一。 isDefined()structKeyExists()都允许使用动态变量。 structKeyExists()&gt;的成员函数也是如此。 structName.keyExists("theKey")

同样,如果您是ColdFusion的新手,我只是假装您从未见过parameterExists()。我相信它已被列为&#34;已弃用&#34;自CF 4.5或那里的某个地方。差不多20年前。这个功能实际上已成为一个关于Adobe如何从未真正抛弃垃圾的笑话。

正如我上面所指出的,我完全摆脱它并与structKeyExists()一起去。我也不知道你的整个网页在做什么,但是根据你提供的代码,我将其更改为:

<cfloop from="1" to="#url.loopcounter#" index="loopvar">
    <cfoutput>
    <cfif structKeyExists(form,"Component#loopvar#")>

    <!--- SANITIZE INPUTS --->
    <cfset inMontplastBarcode = sanitizingFunction(FORM.MontaplastBarcode)>
    <cfset inBadgeNumber = sanitizingFunction(URL.BadgeNumber)>
    <!--- Now use sanitized inputs in query with queryparams --->
    <cfquery name="InsertStuff" datasource="myds">
            INSERT INTO Results (MP_Barcode, Reworked, Reworked_By)
            VALUES (
              <cfqueryparam value="#inMontaplastBarcode#" cfsqltype="cf_sql_varchar" maxlength="50">
            , 'YES'
            , <cfqueryparam value="#inBadgeNumber#" cfsqltype="cf_sql_varchar" maxlength="20">
        )
    </cfquery>

    </cfif>
    </cfoutput>
</cfloop>

在您的数据库中,Reworked应该是一个布尔数据类型。它似乎可能是“是”&#39;或者&#39;否&#39;串。一个真正的布尔值将是a)更小,b)更容易验证。在cfqueryparam中,如果您使用cf_sql_varchar数据类型,请确保设置适当的最大长度。您需要查看可用的CF数据类型,并了解它们与数据库数据类型的匹配方式。 (另见https://cfdocs.org/cfqueryparam

对于您将用于清理输入变量的sanitizingFunction(),您将要编写一个函数,该函数将执行清理变量以消除不安全字符的步骤或你不想要的其他东西。这是一个完全不同的,非常大的话题。

答案 1 :(得分:-1)

在表单中,将复选框命名为simpler。与reworked01reworked50一样。

在操作页面上使用cfparam将其默认为零(因为html表单不会发布未选中的复选框):

<cfloop from="1" to="#url.loopCounter#" index="i">
    <cfparam name="form.reworked#numberFormat(i, 00)#" default="0">
</cfloop>

然后,您可以改为查找值:

,而不是摸索是否存在变量
<cfloop from="1" to="#url.loopCounter#" index="i">
    <cfif evaluate("form.reworked"&i) eq 1>
        <!--- some logic here --->
    <cfelse>
        <!--- some other logic here --->
    </cfif>
</cfloop>