0

现在我一切正常,但我的 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>

投票号.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>    

编辑确定让每个人都了解最新情况。我删除了查询“MemberVote”(是的,它仍然在上面的代码中。我把它留在这里供大家查看)只是为了绕过错误,看看 NewCount 在添加之后是如何工作的,cfc.NewCount(true)就像 orangepips 建议的那样。我得到的是这个;它确实更新了数据库并显示了 NewCount,就像它应该做的那样。但是 1 秒后,页面变白,我所拥有的只是显示在左上角的 NewCount(没有别的)。

Firebug 什么也没显示,我的意思是什么都没有(空白)。没有 HTML、CSS,根本没有代码。不知何故,ajax 刷新并且只显示 NewCount 并且页面的行为就像它试图加载一些东西一样。我是否忘记添加一些东西以防止它刷新或者是其他东西?

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

4

3 回答 3

2

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

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

<CFQUERY NAME="NoCountCK" DATASOURCE="MyDSN">
SELECT *
FROM Ideas
WHERE IdeaID = <cfqueryparam value="#arguments.VoteNo#">
</CFQUERY>
于 2010-10-09T02:26:48.080 回答
0

好的,我修复了 document.write 通过替换覆盖整个 DOM:

    document.write(result) 

有了这个

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

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

我修复了为什么我的 cfc 不会在“MemberVote”查询中将成员投票添加到数据库中。我收到“调用 CFC 时出错:执行数据库查询时出错”。我不得不重新标记表中的一个字段。出于某种原因,尽管 cfc 在 cfc 外部工作时无法正常工作,但仍执行该表。

于 2010-10-10T17:35:18.317 回答
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)”(注意这是区分大小写的)。

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

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

于 2010-10-09T04:13:02.627 回答