动态生成输入字段并将字段数据插入表中的单独行

时间:2013-09-10 13:10:35

标签: sql-server coldfusion

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

1 个答案:

答案 0 :(得分: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:您通常不需要## in标签,即<cfif #rsQuestions.question_type_id# eq 1>可以写为<cfif rsQuestions.question_type_id eq 1>

cfinput标记上没有method属性。