【问题标题】:ColdFusion: how to clear specific fields in a database rowColdFusion:如何清除数据库行中的特定字段
【发布时间】:2014-10-20 20:39:23
【问题描述】:

我正在针对已毕业的大学毕业生进行一项调查,以根据他们的毕业后计划填写。我不确定如何重置或清除更新页面的特定字段。

pg1.cfm,用户使用他们的学生 ID 登录。有几个字段是根据与其 ID 相关的数据自动填充的,例如专业和 GPA。

pg2.cfm,用户回答了一系列关于他们的研究生计划的问题。根据他们对第一个问题的回答显示不同的问题。如果问题已经得到解答,则会出现一个简介,指示用户在 update.cfm 更新他们的计划。

pg3.cfm,用 pg2.cfm 的答案更新数据库,并询问更多有关实习机会的问题。

update.cfm,显示来自 pg2.cfm 的相同问题。就目前而言,update.cfm 将新响应附加到数据库字段,而不是替换现有答案。由于调查的性质 - 根据用户回答的问题字段集填充不同的字段 - 我认为最有效的方法是在提交表单时清除所有可能的基于问题的字段,然后重新填充它们有了新的答案。我只是不确定如何。

【问题讨论】:

  • 只需清除所有可能的基于问题的字段 可能,但这将有助于查看您当前的查询以及实际与期望结果的示例。
  • 您的描述方式太模糊了。请在问题中包含您的代码,将每个 CFM 文件减少到 10 行以下,包括任何 SQL(如果您专注于重要部分,这应该是可行的)。

标签: mysql coldfusion survey


【解决方案1】:

没有代码真的很难提供帮助。当您询问有关代码的问题时,提供相关代码通常会很有帮助。

在我继续之前,我还可以看到保留旧答案的价值,您可以绘制用户如何显示数据的图表。

如果你的表格是简单格式

Answers
AnswerID | StudentID | Answer1 | Answer2 | ... | Answer10

提交 update.cfm 后,此代码将起作用

<cfquery...>
  delete from Answers
   where StudentID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.studentID#">
</cfquery>

<cfquery...>
  insert into Answers(StudentID,Answer1,Answer2,...,Answer10)
  values (<cfqueryparam cfsqltype="cf_sql_integer" value="#session.studentID#">,
          <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.Answer1#">,
          <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.Answer2#">,
          <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.Answer10#">)
</cfquery>

(如果您不使用cfqueryparam,则需要。它可以防止sql注入。)

就我个人而言,我可能不会删除旧数据,我会给它加上日期戳并跟踪它,但这不是我的应用程序。

现在,更好的方法是使用三/五张桌子。它更复杂,但它是处理自定义答案和

的最佳方式
Students (or users table, whatever you call it)
StudentID, Name, Zipcode ...

Questions
QuestionID | QuestionSetID | QuestionText
----[sample data]------------------------
1          | 1             | What is your age
2          | 1             | How quickly do you expect to find a job in your field

Answers
AnswerID | StudentID | QuestionID | AnswerText

QuestionSetNames
QuestionSetID | QuestionSetName=
1             | "Psych Degree question set"
2             | "Computer Science question set"

首先,您将/可以创建一个 QuestionSets,因为正如您所说,您会根据所提供的输入提供不同的问题。

问题不必是问题集独有的。您可以在任何问题集中包含任何问题。

因此,通过问题表中的问题,您可以决定要向某人提问的问题集。并像这样查询它

<cfquery...name="GetQuestions">
  select * from Questions
   where QuestionSetID = <cfqueryparam cfsqltype="cf_sql_integer" value="#setID#">
</cfquery>

<form...><cfoutput><input type="hidden" name="Questions" value="#valuelist(GetQuestions.QUestion)#"></cfoutput>
<cfoutput query="GetQuestions">
  #QuestionText#:<br />
  <input type="text" name="AnswerForQ_#questionID#"...>
</cfoutput></form>

处理

<cfloop list="#form.Questions#" index="i">
  <cfquery...>
    delete from Answers
     where StudentID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.studentID#">
  </cfquery>

  <cfquery...>
    INSERT INTO Answers(StudentID,QuestionID,AnswerText)
    values(<cfqueryparam cfsqltype="cf_sql_integer" value="#session.studentID#">,
           <cfqueryparam cfsqltype="cf_sql_integer" value="#i#">,
           <cfqueryparam cfsqltype="cf_sql_varchar" value="#form["AnswerForQ_#i#"]#">)
  </cfquery>
</cfloop>

然后你可以用

查询
<cfquery name="GetAnswers">
  select QuestionText,AnswerText from Answers,Questions
   where StudentID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.studentID#">
     and Answers.AnswerID = Questions.QuestionID
</cfquery>

<cfoutput>#QuestionText#: #AnswerText#<br /></cfoutput>

您仍然需要编写大量代码,主要是添加问题/问题集的管理能力。

您可以向 Answers 表添加一个时间戳(同一提交的所有答案都将共享),或者您可以制作一个中间 AnswerSheets 表来保存时间戳并将相应的 AnswerSheetID 添加到 Answers。

这似乎是一项不错的工作,但当您尝试添加问题集或尝试分析数据时,它确实会有所回报。另外,一旦它到位,其他人就可以管理它。所以现在的工作更多,以后的工作更少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多