1

背景: ColdFusion フォーム データを配列に保存し、その配列をデータベースの列に格納します。この配列で行う唯一のことは、データベースを呼び出してデータを取得し、それを解析してフォームに戻すことですが、「読み取り専用」としてです。配列には、入力名と値の両方が含まれます。

質問: ColdFusion でデータベースに配列データをクエリした後、データを解析してフォームに戻すにはどのようなプロセスが最適ですか? ループでフォームを再作成する必要がありますか? または、名前を知っているので、入力をターゲットにして値を追加できますか?

また、ColdFusion で作成された配列ではなく、シリアル化された JSON データとしてデータを保存することに価値はありますか?

****編集***

以下は、私のデータのワークフローの概要です。これらのアイテムの一部は、クライアントから要求されたものです。

  1. ユーザーは 65 個の入力でフォームを完成させます。

  2. 送信すると、すべてのフォーム データが配列に格納され、データベースに追加されます。データベースには、次のデータも追加されています。一意の数値識別子、送信日、フォームを送信したユーザー ID (セッション変数から取得)、および最終的に「未割り当て」のステータスがデータベースに追加されます

  3. 管理者は、別のページでキューを確認します。そのキューは、まだ「割り当てられていない」ステータスにあるすべてのフォーム送信を単純にプルします。このキューでは配列は使用されません。

  4. 管理者がキュー内のエントリの 1 つを選択すると、次のページにまったく同じフォームが読み込まれますが、配列を使用してフォームに値を入力し、すべてのフィールドを読み取り専用に設定します。管理者は文字通り、フォーム フィールドから別のシステムに値をコピー アンド ペーストするだけで済みます。(はい、面倒に聞こえるかもしれませんが、この特定のクライアントには他に選択肢がなく、実際には現在使用しているプロセスよりも優れています。)

  5. 配列データは、すべてのデータが確実に収集されるようにする以外の目的で文字通り使用されることはありません。

  6. 配列データは常に全体としてロードする必要があり、一度送信すると変更されることはありません。

これが、私がこれらの質問をしている理由を明確にするのに役立つことを願っています. ありがとう

4

1 に答える 1

0

まず、パンカジの意味。

このようなことができます。車の優先的な側面を保存しているとしましょう。1997 ホンダ アコード。このようにデータを保存できます。

カーズテーブル

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

そして、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

このテーブルに (メーカー、モデル、年) を格納することもできますが、格納しなかったとしましょう。

あなたの挿入はこのようなものになります..

( 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#)。よくわからない場合は、ここに短い記事があります。

さて、前回の質問に対するコメントで説明したように

私が説明したように、最良の方法は別々の行に挿入することです。それに続いて、個別の列は、一括して挿入するよりも優れています。

まとめて挿入する唯一の利点は、簡単だということだけです。

ただし、欠点は数多くあります。

いずれかのデータを選択するには、次のいずれかを行う必要があります

  • すべてのデータを選択します。- 不必要なオーバーヘッド
  • SQL を使用してデータを解析してみてください - 不必要なオーバーヘッド

このフィールドに基づくインターテーブル クエリ (結合) は、大きな頭痛の種になるでしょう。

上記の私の例のようなものを考案したとします。このような車のすべての詳細を選択できます。

<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>
于 2015-01-09T17:42:39.393 に答える