2010-10-08 62 views
0

現在我有一切工作,但我的CFC沒有更新數據庫。我試着改變了cfc頁面中的代碼,但是當我刷新頁面進行測試時,這隻會引發錯誤。所以我知道它正在調用cfc頁面。但是當我點擊鏈接時,除了更新數據庫之外,一切都可以使用。我做錯了什麼?cfajaxproxy/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>  

編輯好了,讓所有人都保持更新。我刪除了查詢「MemberVote」(是的,它仍然在上面的代碼中,我把它留在這裏讓大家看到它),只是爲了避開錯誤,並看到如添加cfc.NewCount(true)後,NewCount如何工作,如orangepips建議。我得到的是這個;它會更新數據庫並按照它的原樣顯示NewCount。但1秒後,頁面變白,我擁有的是NewCount顯示在左上角(沒有其他)。

Firebug什麼都沒顯示,我的意思是什麼都沒有(空白)。沒有HTML,CSS,沒有代碼。不知何故,阿賈克斯刷新,只顯示NewCount和頁面就像它試圖推動的東西。我忘了添加一些東西,以防止令人耳目一新或者是其他的東西嗎?

我需要解決這個新問題,並得到它將成員投票添加到數據庫中的「MemberVote」查詢。有任何想法嗎?

回答

2

沒有看到一個實際的錯誤,我的猜測是,你的問題是使用一個無與倫比的變量名稱相同的功能。取而代之的是在參數標籤之後。 然後在你的代碼中使用countNew變量。

還有一件事......請在您傳遞變量時在查詢中使用cfqueryparam。這可以防止SQL注入攻擊(並提高性能)。例如:

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

錯誤是我讓cfc做的事情,看看它是否被調用。不用擔心山姆我總是在我所有的查詢中使用cfqueryparam。只是沒有把它們放在我的例子中,因爲我想保持代碼簡單,所以有人可以看到我做錯了什麼。 我把「NewCount」變量,並解決更新數據庫中的計數,但這是儘可能工作。查詢插入仍然不起作用。我會嘗試一些不同的東西,看看我是否可以得到正確的東西。 – 2010-10-09 18:32:24

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。您可以右鍵單擊該響應以在新的瀏覽器選項卡中打開。

+0

謝謝orangepips我在「cfc.setCallbackHandler(getDataResult);」之後放入了「NewCount」變量。並且確實解決了更新數據庫中的計數,但是就其工作而言。查詢插入仍然不起作用。我現在正在收到「錯誤執行數據庫查詢」錯誤。我正在玩它,我可能會很幸運。如果你看到什麼,請讓我知道。 – 2010-10-09 18:32:55

+0

我更新了上面的代碼,並添加了現在正在發生的事情。 – 2010-10-09 20:40:07

+0

在我看來,MemberVote cfquery調用缺少圍繞「N」作爲最後一個要插入的值的單引號。另外,你是否在exception.log中獲取任何內容? – orangepips 2010-10-10 23:50:02

0

好吧,我固定的文件撰寫覆蓋整個DOM更換:

document.write(result) 

與此

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

這似乎保持<SPAN ID=" NewCount'> </SPAN>,而不是覆蓋我的頁面內的變化。

我解釋了爲什麼我的cfc不會將成員投票添加到數據庫的「MemberVote」查詢中。我得到一個「錯誤調用CFC:錯誤執行數據庫查詢」。我不得不在表格中重新標記一個字段。出於某種原因執行表,儘管cfc在cfc之外工作時不起作用。