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

Sql 更新分数以覆盖以前的分数,sql,coldfusion,Sql,Coldfusion,我有一个页面,上面列出了诗歌标题、平均分数和评分的评委。这些项目分为3列。当法官点击诗歌标题时,他会被带到诗歌概述页面,该页面显示诗歌内容,并允许法官对诗歌从1到3进行评分。如果法官已经为这首诗打分,他的分数将载入下拉列表,并显示一条消息,说明他已经为这首诗打分,如果他更改分数,它将更新他的分数。我的更新查询不起作用,但我想知道这是否是因为我的逻辑问题 更新查询从第86行开始。我的想法是,如果已经有一个分数,ARRRDuplicate数组将显示一条消息,说明saying并在下拉列表中加载上一个分

我有一个页面,上面列出了诗歌标题、平均分数和评分的评委。这些项目分为3列。当法官点击诗歌标题时,他会被带到诗歌概述页面,该页面显示诗歌内容,并允许法官对诗歌从1到3进行评分。如果法官已经为这首诗打分,他的分数将载入下拉列表,并显示一条消息,说明他已经为这首诗打分,如果他更改分数,它将更新他的分数。我的更新查询不起作用,但我想知道这是否是因为我的逻辑问题

更新查询从第86行开始。我的想法是,如果已经有一个分数,ARRRDuplicate数组将显示一条消息,说明saying并在下拉列表中加载上一个分数。如果需要,裁判可以更改分数。然而,现在的情况是,每次都将分数写入新记录,而不是更新现有分数

PoemCores表由poemID、judgeID和score组成。没有pk。是否应该有?

您需要添加

AND judgeID = ?

否则,它将尝试更新该特定诗歌的每个分数

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

你可以改变这个

<cfif duplicateCheck.recordCount GT '0'>

(这是字符串比较)与此(数字比较)


甚至只是这个(布尔值)


这两条IF语句是相同的,所以如果没有错误,您将执行更新和插入。你需要重新思考你的逻辑

<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>

更新PoemCores
设置分数='#表格.评分#'
其中poemID=
插入PoemCores(poemID、score、DejusticeId)
值(“#url.id”、“#form.rating”、“#session.username”)
您可能想在这里添加一个额外的IF语句,检查arrdeplicates是否也有长度。如果是的话,他们之前已经对此进行了评分,请执行更新查询。否则,请执行插入

<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>

更新PoemCores
设置分数='#表格.评分#'
其中poemID=
插入PoemCores(poemID、score、DejusticeId)
值(“#url.id”、“#form.rating”、“#session.username”)

我在第98行的insert query中看到了一个可能的问题,除非您禁用了反斜杠转义,否则我认为您可能有SQL注入。同样在第12行和其他行中,您可能希望查看并检查此内容。谢谢。我添加了斜杠:您不需要主键,PoemID和JudgeID的组合作为复合键就足够了。谢谢您的建议。我已将duplicateCheck更改为duplicateCheck.recordCount。按照您的建议重新排列逻辑帮助我实现了预期的结果。谢谢你的评论!
<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>
<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>