-1

我有一些动态创建表单控件的表单代码。我需要将每个动态生成的表单字段插入到单独的表格行中:例如,如果为一个表单派生5个问题,则用户将输入答案,需要将questionid和answer插入到表格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>

并且 cfinput 标签上没有method属性。

于 2013-09-10T16:27:24.047 回答