更新分数以覆盖以前的分数

时间:2011-05-31 13:32:42

标签: sql coldfusion

我有一个页面列出诗歌标题,平均分数,并列出评分诗歌的评委。这些项目分为3列。当法官点击诗歌标题时,他将被带到诗歌概述页面,显示诗歌内容,并允许法官将诗歌从1到3评价。如果法官已经对这首诗进行评分,他的分数将被加载到诗歌中。下拉列表中会显示一条消息,表示他已经对其进行了评分,如果他更改了分数,则会更新他的分数。我的更新查询无效,但我想知道是否是由于我的逻辑问题。

The full code in question is here.更新查询从第86行开始。我的想法是,如果已经有分数,arrDuplicate数组将显示一条消息,说明并在下拉列表中加载上一个分数。如果需要,法官可以改变分数。但是,现在的情况是,每次都会将分数写入新记录,而不是更新现有分数。

PoemScores表由poemID,judgendID和score组成。没有PK。应该有吗?

2 个答案:

答案 0 :(得分:1)

您需要添加

AND judgeID = ?

查询,否则会尝试更新该特定诗歌的每个分数。

答案 1 :(得分:0)

将cfqueryparam添加到duplicateCheck,updateScore和qRatePoem查询中,主要是为了避免SQL注入。

你可以改变这个

<cfif duplicateCheck.recordCount GT '0'>

(这是一个字符串比较)到这个(数字比较)

<cfif duplicateCheck.recordCount GT 0>

甚至只是这个(布尔)

<cfif duplicateCheck.recordCount>

这两个IF语句是相同的,因此如果没有错误,您将同时执行Update,然后执行Insert。你需要重新思考你的逻辑。

<cfif NOT ArrayLen( arrErrors ) >
        <cfquery name="updateScore" datasource="#request.dsn#">
                UPDATE PoemScores
                SET score = '#form.rating#'
                WHERE poemID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#url.id#">
        </cfquery>
</cfif>


<cfif NOT ArrayLen( arrErrors )>
        <!--- INSERT DATABASE QUERY--->
        <cfquery name="qRatePoem" datasource="#request.dsn#">
                INSERT INTO PoemScores (poemID, score, judgeID)
                VALUES ('#url.id#', '#form.rating#', '#session.username#')
        </cfquery>

        <!---<cflocation url="dash.cfm" addtoken="no">--->
</cfif>

你可能想在这里添加一个额外的IF语句,检查arrDuplicates是否也有长度。如果确实如此,他们之前已经对此进行了评分,请执行更新查询。否则请插入。

<cfif NOT ArrayLen( arrErrors ) >
   <cfif ArrayLen(arrDuplicate)> <!--- already submitted a score for this poem --->
        <cfquery name="updateScore" datasource="#request.dsn#">
                UPDATE PoemScores
                SET score = '#form.rating#'
                WHERE poemID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#url.id#">
        </cfquery>
   <cfelse>
        <!--- INSERT DATABASE QUERY--->
        <cfquery name="qRatePoem" datasource="#request.dsn#">
                INSERT INTO PoemScores (poemID, score, judgeID)
                VALUES ('#url.id#', '#form.rating#', '#session.username#')
        </cfquery>
   </cfif>
        <!---<cflocation url="dash.cfm" addtoken="no">--->
</cfif>