cfajaxproxy / cfc数据库更新失败

时间:2010-10-08 23:48:53

标签: ajax coldfusion coldfusion-8 cfc

现在我的一切正常,但我的cfc没有更新数据库。我尝试更改cfc页面中的代码,但是当我刷新页面进行测试时,这只会引发错误。所以我知道它正在调用cfc页面。但是当我点击链接时,一切都有效,除了更新数据库。我做错了什么?

以下是我提出的代码。这只是Yes / No Vote App的No Vote部分。保持这个问题简单。我是在正确的轨道上吗?这看起来应该很简单。

投票链接

<A HREF="javascript:()" onclick="VoteNoID('#IdeaID#');"><SPAN ID="VoteNoMessage">I Vote No</SPAN></A> - <SPAN ID="NewNoCount">#NoCount#</SPAN>

Ajax / cfajaxproxy

<cfajaxproxy cfc="CFC/MyCFC" jsclassname="MyCFC">  
<script LANGUAGE="JavaScript">  
 function VoteNoID()    
           {    
            var VoteNoID = document.getElementById("VoteNoID");   
            var cfc = new MyCFC();     
             cfc.setCallbackHandler(getDataResult);   
             cfc.NewCount(true)  
            var VoteNoDescription = document.getElementById("VoteNoDescription").style.display='none';  
    $('#NewNoCount').html("");
    $('#VoteNoMessage').html('You voted "No" with');
           }  
       function getDataResult(result)  
           {  
            document.write(result);  
           }  
</script>

VoteNo.cfc

<cfcomponent>
  <cffunction name="NewCount" access="remote">
    <cfargument name="VoteNo" required="yes">
    <CFQUERY NAME="NoCountCK" DATASOURCE="MyDSN">
      SELECT *
      FROM Ideas
      WHERE IdeaID = #arguments.VoteNo#
    </CFQUERY>
    <CFSET NewCount=#NoCountCK.NoCount#+1>
    <CFQUERY NAME="UpdateNoCount" DATASOURCE="MyDSN">
      UPDATE  Ideas
      SET  NoCount = #NewCount#
      WHERE IdeaID = #arguments.VoteNo#
    </CFQUERY>
    <CFQUERY NAME="Member" DATASOURCE="MyDSN">
      SELECT *
      FROM Members
      WHERE MemberID = 1
    </CFQUERY>
    <CFQUERY NAME="MemberVote" DATASOURCE="MyDSN">
      INSERT INTO ComingSoonVote(CSID,MemberID,DatePosted,YesNo)
      VALUES(#arguments.VoteNo#,#COOKIE.MemberID#,#NOW()#,N)
    </CFQUERY>
    <cfreturn NewCount>
  </cffunction>
</cfcomponent>    

修改确定让每个人都知道最新动态。我删除了查询“会员投票”(是的,它仍然在上面的代码中。我把它留在这里供所有人查看)只是为了解决错误,看看在添加cfc.NewCount(true)之后NewCount是如何运作的。我得到的是这个;它会更新数据库并显示NewCount,就像它想要做的那样。但是1秒之后,页面变白了,我所拥有的是NewCount显示在左上角(没有其他)。

Firebug没有显示任何内容,我的意思是什么(空白)。没有HTML,CSS,根本没有代码。不知何故,ajax刷新并且只显示NewCount,并且页面的行为就像是在试图挖掘某些东西。我是否忘记添加一些东西以防止它变得清爽,还是其他东西?

我需要解决这个新问题并让它将成员投票添加到“MemberVote”查询中的数据库中。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

在没有看到实际错误的情况下,我的猜测是你的问题是使用与函数相同的无范围变量名。而不是把它放在参数标签之后。 然后在你的代码中使用countNew变量。

另外一件事......请在传递变量时在查询中使用cfqueryparam,plesae,plesae。这可以保护您免受SQL注入攻击(并提高性能)。例如:

<CFQUERY NAME="NoCountCK" DATASOURCE="MyDSN">
SELECT *
FROM Ideas
WHERE IdeaID = <cfqueryparam value="#arguments.VoteNo#">
</CFQUERY>

答案 1 :(得分:0)

首先,我认为你永远不会在MyCFC组件中调用“NewCount”函数。正如cfajaxproxy文档演示(http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_a-b_3.html),您调用cfajaxproxy,初始化JavaScript对象,并在其上调用方法宾语。所以在你的情况下,在“cfc.setCallbackHandler(getDataResult);”之后它将是“cfc.NewCount(true)”(注意这是区分大小写的)。

接下来,要检查自己,请使用Firefox Firebug。这将允许您轻松地JavaScript错误和AJAX请求。使用Firebug运行加载页面。检查Firebug控制台是否存在JavaScript错误。如果它抱怨它无法找到库cfajax.js那么您可能需要设置一个Web服务器映射到CFIDE目录 - 其中ColdFusion保存其随附的各种JavaScript文件。

最后,点击“投票”按钮。检查Firebug中的AJAX请求以查看已触发的内容。查看响应代码是什么。不是200?在Firebug控制台中打开请求以查看响应HTML。您可以在新的浏览器选项卡中右键单击要打开的响应。

答案 2 :(得分:0)

好的我修复了document.write,通过替换:

来覆盖整个DOM
    document.write(result) 

用这个

    var content = document.getElementById('NewCount').innerHTML=result; 

这似乎将更改保留在<SPAN ID=" NewCount'> </SPAN>内,而不是覆盖我的页面。

我修复了为什么我的cfc不会在“MemberVote”查询中将成员投票添加到数据库的原因。我得到一个“调用CFC时出错:执行数据库查询时出错”。我不得不在表格中重新标记一个字段。出于某种原因执行表虽然cfc在cfc之外工作时不起作用。