现在,我所有的东西都在工作,但我的cfc并没有更新数据库。我试图更改cfc页面中的代码,但当我刷新页面以测试它时,只会出现错误。所以我知道这是在呼叫cfc页面。但是,当我单击该链接时,除了更新数据库之外,一切都正常工作。我做错什么了?
下面是我想出的代码。这只是一个“是”/“不”应用程序的“不投票”部分。让这个问题简单明了。我在正确的轨道上吗?这看起来应该很简单。
投票链路
<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> 编辑 Ok让每个人都更新。我删除了查询"MemberVote“(是的,它仍然在上面的代码中。我把它留给每个人看)只是为了避开错误,看看NewCount在添加cfc.NewCount(true)之后是如何工作的,就像橘子表建议的那样。我得到的是这个;它确实更新了数据库并显示了NewCount,就像它应该做的那样。但是1秒后,页面变成白色,我所拥有的就是显示在左上角的NewCount (没有其他的)。
Firebug什么也没有显示,我的意思是什么都没有(空白)。没有HTML,CSS,没有代码。不知怎么的,ajax刷新了,只显示了NewCount,页面的表现就像是在尝试记录什么。我是忘了添加什么东西来保持它的清爽,还是其他的东西?
我需要修复这个新问题,并让它将成员投票添加到"MemberVote“查询中的数据库中。有什么想法吗?
发布于 2010-10-09 02:26:48
在没有看到实际错误的情况下,我猜您的问题是使用与函数相同的非作用域变量名。而不是把它放在参数标签后面。然后在后面的代码中使用countNew变量。
当您传入变量时,另一个thing...please,plesae,plesae在查询中使用cfqueryparam。这可以保护您免受sql注入攻击(并提高性能)。例如:
<CFQUERY NAME="NoCountCK" DATASOURCE="MyDSN">
SELECT *
FROM Ideas
WHERE IdeaID = <cfqueryparam value="#arguments.VoteNo#">
</CFQUERY>发布于 2010-10-09 04:13:02
首先,我认为您永远不会在MyCFC组件中调用“MyCFC”函数。正如cfajaxproxy文档所演示的(3.html),您调用cfajaxproxy,初始化一个JavaScript对象,并对该对象调用一个方法。因此,在您的示例中,在“cfc.NewCount(GetDataResult)”之后应该是“cfc.setCallbackHandler(True)”(注意这是区分大小写的)。
接下来,要检查自己,请在火虫中使用火狐。这将允许您轻松地执行JavaScript错误和AJAX请求。在运行Firebug的情况下加载页面。检查Firebug控制台是否有JavaScript错误。如果它抱怨找不到库cfajax.js,那么您可能需要设置一个到CFIDE目录的web服务器映射-- ColdFusion保存它附带的各种JavaScript文件。
最后,单击“投票”按钮。检查Firebug中的AJAX请求,以查看是否启动了某些内容。看看响应代码是什么。不是200?在Firebug控制台中打开请求,查看响应HTML。您可以在新的浏览器选项卡中右键单击要打开的响应。
发布于 2010-10-10 17:35:18
好的,我通过替换以下方法修复了覆盖整个DOM的document.write:
document.write(result) 有了这个
var content = document.getElementById('NewCount').innerHTML=result; 这似乎保持了<SPAN ID=" NewCount'> </SPAN>中的更改,而不是覆盖我的页面。
我修正了为什么我的cfc不将成员投票到"MemberVote“查询中的数据库。我得到了一个“调用CFC错误:执行数据库查询错误”。我不得不把桌子上的一个字段重新贴上标签。由于某种原因,尽管cfc在cfc之外工作时无法工作,但是执行该表。
https://stackoverflow.com/questions/3895034
复制相似问题