我有一个页面列出诗歌标题,平均分数,并列出评分诗歌的评委。这些项目分为3列。当法官点击诗歌标题时,他将被带到诗歌概述页面,显示诗歌内容,并允许法官将诗歌从1到3评价。如果法官已经对这首诗进行评分,他的分数将被加载到诗歌中。下拉列表中会显示一条消息,表示他已经对其进行了评分,如果他更改了分数,则会更新他的分数。我的更新查询无效,但我想知道是否是由于我的逻辑问题。
The full code in question is here.更新查询从第86行开始。我的想法是,如果已经有分数,arrDuplicate数组将显示一条消息,说明并在下拉列表中加载上一个分数。如果需要,法官可以改变分数。但是,现在的情况是,每次都会将分数写入新记录,而不是更新现有分数。
PoemScores表由poemID,judgendID和score组成。没有PK。应该有吗?
答案 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>