ColdFusion数组 - 将数据存储在数组

时间:2015-09-19 11:52:06

标签: arrays forms struct coldfusion

我有一个存储姓名,电子邮件和消息的简单表单。提交时,我将3个字段存储在2D数组中,每增加一次我提交表单,我想将该数据添加到已经提交的内容中。

但是每次我提交表单时,不是在数组中创建新元素,而是覆盖之前提交的内容。

在我的Application.cfc中,我按如下方式声明我的数组:

<cffunction name="onApplicationStart">
    <!--- Define array that will store form submissions --->
    <cfset Application.formSubmissions = ArrayNew(2) />
</cffunction>

我的test.cfm页面有主要代码:

<cfscript>
// if form submitted
if (StructKeyExists(Form,"name") AND Form.name NEQ "") {
    // define constants for column names
    Variables.name = 1;
    Variables.email = 2;
    Variables.message = 3;
    // define array position
    Variables.arrayLen = ArrayLen(Application.formSubmissions);
    Variables.arrayPos = Variables.arrayLen + 1;
    // add form data to array
    Application.formSubmissions[Variables.arrayPos][Variables.name] = Form.name;
    Application.formSubmissions[Variables.arrayPos][Variables.email] = Form.email;
    Application.formSubmissions[Variables.arrayPos][Variables.message] = Form.message;
    // reset form fields to stop insert
    Form.name = "";
    Form.email = "";
    Form.message = "";
}
</cfscript>
<cfdump var="#Application.formSubmissions#">
<cfoutput>

<form action="##" method="post" name="contactForm" id="contactForm">
    <table>
        <tr>
            <td><label name="nameLabel" for="name">Name</label></td>
            <td><input type="text" name="name" id="name" /></td>
        </tr>
        <tr>
            <td><label name="emailLabel" for="email">Email</label></td>
            <td><input type="text" name="email" id="email" /></td>
        </tr>
        <tr>
            <td><label name="emailLabel" for="email">Message</label></td>
            <td><textarea name="message" id="message" cols="50" rows="5"></textarea></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="submitBtn" id="submitBtn" value="SUBMIT" /></td>
        </tr>
    </table>

</form>

</cfoutput>

有人可以指出我似乎出错了吗?

3 个答案:

答案 0 :(得分:0)

您的代码适合我。我怀疑你的onApplicationStart事件会在每次请求时被触发。

要确保不重新定义Application.formSubmissions,请删除<cfset Application.formSubmissions = ArrayNew(2) />函数中的行onApplicationStart并替换示例中的<cfscript>部分使用以下代码:

<cfscript>

    if ( !structIsEmpty(Form) ) {

        if (
            ( structKeyExists(Form, "name") && len(trim(Form.name)) ) &&
            ( structKeyExists(Form, "email") && len(trim(Form.email)) ) &&
            ( structKeyExists(Form, "name") && len(trim(Form.name)) )
        ) {

            if ( !structKeyExists(Application, "formSubmissions") ) {
                Application.formSubmissions = [];
            }

            Application.formSubmissions.add([
                trim(Form.name),
                trim(Form.email),
                trim(Form.message)
            ]);
        }

    }

</cfscript>

这将初始化Application.formSubmissions懒惰的方式并阻止娱乐。 注意:这仅用于测试目的,因为应锁定应用程序范围以避免竞争条件。您应该添加表单验证,无论如何。

答案 1 :(得分:0)

使用struct,更好更容易理解。

<cffunction name="onApplicationStart">
    <!--- Define array that will store form submissions --->
    <cfset Application.formSubmissions = ArrayNew(1) />
</cffunction>
<cfscript>
    Application.formSubmissions[Variables.arrayPos] = StrunctNew();
    Application.formSubmissions[Variables.arrayPos].name = Form.name;
    Application.formSubmissions[Variables.arrayPos].email  = Form.email;
    Application.formSubmissions[Variables.arrayPos].message  = Form.message;
</cfscript>

答案 2 :(得分:0)

还有一个提示:

使用CompareNoCase比较字符串。它比EQ / NEQ快。请参阅以下信息。

CompareNoCase

描述:对两个字符串执行不区分大小写的比较。

返回:差异的指标:

负数,如果string1小于string2 0,如果string1等于string2正数,如果string1大于string2

功能语法:

CompareNoCase(Form.name, "")

如果以上返回0,则表单变量为空。

ColdFusion Documentation

中的更多数据