将包含输入名称和值的数组解析为只读形式

Parse array that contains input names and values back into a form as readonly

背景: 我要将我的 ColdFusion 表单数据保存到一个数组中,并将该数组存储到数据库的列中。我将对这个数组做的唯一一件事是调用数据库获取数据并将其解析回我的表单,但作为 "Read Only"。该数组将包含输入名称和值。

问题: 在 ColdFusion 中,当我查询数据库中的数组数据后,将数据解析回我的表单的最佳过程是什么?我是否必须循环重新创建表单?或者我可以定位输入并添加值,因为我会知道它们的名字吗?

另外,将数据保存为序列化 JSON 数据与使用 ColdFusion 创建的数组相比是否有任何价值?

****编辑***

下面是我的数据工作流程的概述。其中一些项目是客户要求的。

  1. 用户完成了 65 个输入的表单。

  2. On Submit 所有表单数据都存储在一个数组中,该数组被添加到数据库中。数据库还添加了以下数据。唯一的数字标识符、提交日期、提交表单的用户 ID(从会话变量中提取),最后 "not assigned" 的状态被添加到数据库

  3. 管理员在单独的页面上检查队列。该队列简单地提取所有仍处于 "not assigned" 状态的表单提交。该队列未使用该数组。

  4. 如果管理员选择队列中的条目之一,下一页将加载完全相同的表单,但我将使用数组将值填充到表单中并将所有字段设置为只读。管理员实际上只需要将表单字段中的值复制并粘贴到不同的系统中。 (是的,我知道这听起来很乏味,但对于这个特定的客户来说,没有其他选择,这实际上比他们目前使用的流程更好。)

  5. 除了确保收集到所有数据外,数组数据绝不会用于任何其他用途。

  6. 数组数据总是要整体加载,一旦提交永远不会改变

我希望这有助于澄清我问这些问题的原因。谢谢

首先,pankaj是什么意思。

你可以这样做。假设我正在存储汽车的优惠信息。 1997 本田雅阁。您可能会像这样在其中存储数据。

汽车Table

CarID (PrimKey) | Make  | Model     | Year
--------------------------------------------
47              | Honda | Accord    | 1997
48              | Chevy | Malibu    | 2005

然后我可以有一个单独的 table 叫做 CarSpecs

SpecID (PrimKey) | CarID | SpecName | SpecValue
-----------------------------------------------
1001             | 47    | Color    | Red
1002             | 47    | Transmsn | Auto
1003             | 47    | Doors    | 4
1004             | 48    | Color    | Green
1005             | 48    | Transmsn | Manual

您也可以在此 table 中存储(品牌、型号、年份),但假设您没有。

你的插入变成这样..

(如果您没有使用 cfqueryparam,请查阅它,它可以防止 sql 注入,这是一种常见的黑客攻击形式。)

  <cfquery name="NewCar">
    insert into Cars(Make, Model, Year)
    values(<cfqueryparam value="#form.make#" cfsqltype="cf_sql_varchar">,
      <cfqueryparam value="#form.model#" cfsqltype="cf_sql_varchar">,
      <cfqueryparam value="#form.year#" cfsqltype="cf_sql_integer">)
  </cfquery>

  <cfset DeletedFields = "make,model,year,submit_button,tos_agree">
  
  <cfloop list="#form.fieldnames#" index="df">
    <cfif not listfind(deletedfields,df)>
      <cfquery>
        insert into CarSpecs(CarID,SpecName,SpecValue)
        values(<cfqueryparam cfsqltype="cf_sql_integer" value="#NewCar.generatedKey#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#fn#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#form[fn]#">)
      </cfquery>
    </cfif>
  </cfloop>

有几种简单的方法可以获取您刚刚插入的记录的 ID (#NewCar.generatedkey#)。 Here's a short article on it if you're unfamiliar.

现在,正如我们在对您上一个问题的评论中所述

最好的方法是像我演示的那样插入单独的行。之后,单独的列会比批量插入更好。

批量插入的唯一好处就是简单,仅此而已。

然而,缺点很多。

要select任何数据,您必须

  • select全部数据。 - 不必要的开销
  • 尝试使用 sql 解析数据 - 不必要的开销

Intertable 基于这个字段的查询(连接)将是一个巨大的头痛。

所以假设你设计了类似我上面的例子的东西。您可以 select 像这样的汽车的所有详细信息。

<cfoutput query="CarDetails" group="carID">#Make# #Model# #Year#<br /><br />
  <cfoutput>#replace(specname,"_"," ","ALL")#: <input type="text" name="#specname#" value="#htmleditformat(specvalue)#" /> <br /></cfoutput>
</cfoutput>