-1

フォーム コントロールを動的に作成するフォーム コードがあります。動的に生成された各フォーム フィールドを個別のテーブル行に挿入する必要があります。たとえば、フォームに対して 5 つの質問が生成された場合、ユーザーは回答を入力し、質問 ID と回答をテーブル Questions: questionID, Answers に挿入する必要があります。

FORMループして結果を取得するにはどうすればよいですか? これは私が試したものです:

<cfform name="form" method="post" action="TestQA.cfm">
  <table border="0">
   <tr>
     <td>&nbsp;</td>
     <td>question</td>
     <td>&nbsp;</td>
   </tr>
   <cfoutput query="rsQuestions">
     <tr>
       <td><cfinput type="hidden" name="question_id" 
               id="question_id" 
               value="#rsQuestions.question_id#">
       </td>
       <td>#rsQuestions.question#</td>
       <td>
            <cfif #rsQuestions.question_type_id# eq 1>
                <cfinput type="text" name="answer" 
                        message="#rsQuestions.Message#" 
                        tooltip="#rsQuestions.Tooltip#" 
                        range="#rsQuestions.range#"   
                        required="Yes" 
                        size="#rsQuestions.Size#" 
                        method="Post">
            </cfif>
       </td>
     </tr>  
     </cfoutput>
     <tr>
       <td>&nbsp;</td>
       <td>&nbsp;</td>
       <td><cfinput type="submit" name="Submit" value="Submit"></td>
     </tr>
    </table>
    <br />
</cfform>

質問をテーブルに挿入する手順:

<cfloop collection=#form# item="field"> 
    <cfif field neq 'submit'>
        <cfquery datasource="dstest">  
            INSERT INTO dbo.group_member_questionnaire_answers (question_id, answer)
            VALUES(#form.Question_ID#, #form.Answer#)
        </cfquery>
    </cfif>
</cfloop>

<cfoutput>Answers inserted successfully into database</cfoutput> 

私はこれにステートメントを調整しました:

<cfloop from="1" to="#val(form.TotalFields)#" index="x"> 

        <cfquery datasource="dsED">  
        INSERT INTO dbo.group_member_questionnaire_answers (question_id, answer)
        VALUES(#form.Question_ID#, #form.Answer#)
        </cfquery>



</cfloop>

This is the result: Error Executing Database Query.  
[Macromedia][SQLServer JDBC Driver][SQLServer]Invalid column name 'no'.

The error occurred in

7 :         <cfquery datasource="dstest">  
8 :         INSERT INTO dbo.group_member_questionnaire_answers (question_id, answer)
9 :         VALUES(#form.Question_ID#, #form.Answer#)
10 :         </cfquery>
11 :         
________________________________________
SQL    INSERT INTO dbo.group_member_questionnaire_answers (question_id, answer) VALUES(62,63, 90,no)
DATASOURCE    dsED
VENDORERRORCODE   207
SQLSTATE      42S22

Resources:
4

1 に答える 1

0

問題は、各質問/回答入力フィールドに同じ ID を使用していることです。したがって、せいぜい次のようなリストになります。

question_id = 1,2,3,4,5
answer = foo,foo,foo,foo,bar

代わりに、質問 ID に基づいて、各回答に独自の ID を与えることをお勧めします。その後、フォーム ハンドラーでこれらを非常に簡単にループできます。

これは特に洗練されたアプローチではありませんが、基本的な考え方は次のとおりです。

   <!--- 1 hidden field with all the IDs --->
   <cfoutput><input type="hidden" name="question_ids" id="question_ids" value="#valueList(rsQuestions.question_id)#"></cfoutput>
   <cfoutput query="rsQuestions">
     <tr>
       <td></td>
       <td>#rsQuestions.question#</td>
       <td>
            <cfif rsQuestions.question_type_id eq 1>
                <cfinput type="text" name="answer_#rsQuestions.question_id#" 
                        message="#rsQuestions.Message#" 
                        tooltip="#rsQuestions.Tooltip#" 
                        range="#rsQuestions.range#"   
                        required="Yes" 
                        size="#rsQuestions.Size#">
            </cfif>
       </td>
     </tr>  
     </cfoutput>

次に、その非表示のフォームをループして、それぞれに質問/回答を挿入します。

<cfloop list="#form.question_ids#" index="question"> 
        <cfquery datasource="dstest">  
            INSERT INTO dbo.group_member_questionnaire_answers (question_id, answer)
            VALUES(<cfqueryparam value="#question#" cfsqltype="CF_SQL_INTEGER">, <cfqueryparam value="#form['answer_' & question]#" cfsqltype="CF_SQL_VARCHAR">)
        </cfquery>
</cfloop>

PS: 通常、タグに # # は必要ありません。つまり、次の<cfif #rsQuestions.question_type_id# eq 1>ように記述できます。<cfif rsQuestions.question_type_id eq 1>

methodまた、cfinput タグには属性がありません。

于 2013-09-10T16:27:24.047 に答える