cfargument没有通过cfquery传递cfoutput

时间:2013-11-28 13:27:41

标签: coldfusion

我无法在cfoutput中使用student_id和查询。我的论点没有传入getStudentAnswers函数。我怎样才能做到这一点?

我想创建JSON,需要在考试附近添加问题和答案的答案,如下所示:

[
  {
    "id": "7",
    "type": "2",
    "question_id": "20",
    "question": "Write a summary by answering the questions below: * What is convergence? * What will be the implications of convergence on classical media? on users? * Which devices/media forms do you think will converge nowadays/in the future? * What will be the opportunities and threats emerged by the convergence?",
    "question_type": "0",
    "answer": "",
    "name": "Assignment3ver2",
    "deadline_date": "2014-11-22 00:00:00.0"
  }

功能

<cffunction name="getQuestion" > 
<cfargument name="exam_id" type="string" required="true" >
<cfargument name="student_id" type="string" required="true" >

<cfset mert="#student_id#" >

<cfquery dataSource="mobileCourse" name="questselect"> 
    SELECT id,question,question_type FROM dbo.Questions WHERE exam_id=#exam_id#
</cfquery>

<cfoutput query="questselect">
    "question_id": "#id#",
    "question": "#question#",
    "question_type": "#question_type#",
    #getStudentAnswers(mert, id, question)#
</cfoutput>

<cfreturn /> 

<cffunction name="getStudentAnswers" > 
<cfargument name="student_id" type="string" required="true" >
<cfargument name="question_id" type="string" required="true" >
<cfargument name="question" type="string" required="true" >

<cfquery dataSource="mobileCourse" name="questselecta"> 
    SELECT * FROM dbo.ANSWERS WHERE question_id=#question_id# AND  student_id=#student_id# 
</cfquery>

<cfif #questselecta.recordcount# gte 1>
<cfoutput query="questselecta">
    "answer": "#answer#",
</cfoutput>
<cfelse>
    "answer": "",
</cfif>

<cfreturn /> 

1 个答案:

答案 0 :(得分:0)

这不是您问题的直接答案。但是,即使忽略了评论中提到的错误,上面的代码也不是完成工作的有效方法。没有必要为考试中的每个问题运行单独的查询。只需使用JOIN运行单个查询。由于您似乎想要所有问题,即使是没有答案的问题,也请将其设为OUTER JOIN

注意:切勿在{{1​​}}中使用原始参数,因为它会使您的数据库面临sql注入的风险。而是使用cfquerycfqueryparam匹配列的实际数据类型(see documentation matrix)。

cfsqltype

获得查询结果后,使用它来构建结果对象。确切的结构取决于您的应用程序,但假设可能有多个问题 - 一组结构将是一个很好的例子。

确保正确确定所有变量的范围。所有函数局部变量都应<!--- adjust cfsqltypes as needed ---> <cfquery name="yourQueryName" ....> SELECT q.id, q.question, q.question_type, a.answer, ... other columns FROM Questions q LEFT JOIN Answers a ON a.question_id = q.question_id AND a.student_id = <cfqueryparam value="#ARGUMENTS.student_id#" cfsqltype="cf_sql_integer"> WHERE q.exam_id = <cfqueryparam value="#ARGUMENTS.exam_id#" cfsqltype="cf_sql_integer"> </cfquery> 作用域以防止潜在的线程问题:包含查询名称

var/local

最后,使用<!--- localize all variables ---> <cfset var yourQueryName = ""> <cfset var resultArray = "" > <cfset var data = "" > .... run query .... <!--- first initialize the array ---> <cfset resultArray = []> <!--- loop through your query and build an array of structures ---> <cfloop query="yourQueryName"> <!--- create new structure to store current question ---> <cfset data = {}> <cfset data["question_id"] = yourQueryName.question_id> <cfset data["question"] = yourQueryName.question> <cfset data["answer"] = yourQueryName.answer> ... other keys .... <!--- append the question to your array ---> <cfset arrayAppend(resultArray, data)> </cfloop> 以JSON格式返回结构数组:

serializeJSON