0

これですべてが機能しましたが、cfc がデータベースを更新していません。CFC ページのコードを変更しようとしましたが、ページを更新してテストするとエラーが発生します。だから私はそれがcfcページを呼び出していることを知っています。しかし、リンクをクリックすると、データベースの更新以外はすべて機能します。私は何を間違えましたか?

以下は私が思いついたコードです。これは、Yes/No Vote アプリの 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>    

Ok を編集して、全員を最新の状態にします。クエリ「MemberVote」を削除しました(はい、上記のコードにはまだあります。誰もが見られるようにここに残しました)エラーを回避し、オレンジピップがcfc.NewCount(true)提案したように追加した後に NewCount がどのように機能するかを確認します。私が得るのはこれです。データベースを更新し、想定どおりに NewCount を表示します。しかし、1 秒後にページが白くなり、左上に NewCount が表示されるだけです (他には何もありません)。

Firebug は何も表示しません。つまり、Nothing (空白) です。HTML、CSS、コードは一切ありません。どういうわけか ajax が更新され、NewCount のみが表示され、ページは何かを読み込もうとしているように動作しています。リフレッシュしないように何かを追加するのを忘れましたか、それとも何か他のものですか?

この新しい問題を修正し、「MemberVote」クエリでメンバー投票をデータベースに追加する必要があります。何か案は?

4

3 に答える 3

2

実際のエラーは表示されませんが、問題は関数と同じスコープ外の変数名を使用することにあると思います。代わりに、引数タグの直後に配置します。次に、コードの後半でcountNew変数を使用します。

もう1つ...お願いします、plesae、plesaeは、変数を渡すときにクエリでcfqueryparamを使用します。これにより、SQLインジェクション攻撃からユーザーを保護します(パフォーマンスを向上させます)。例えば:

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

OK、次のように置き換えて、DOM 全体を上書きする document.write を修正しました。

    document.write(result) 

これとともに

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

これにより、変更が保持され<SPAN ID=" NewCount'> </SPAN> 、ページが上書きされないようです。

「MemberVote」クエリで、cfc がメンバー投票をデータベースに追加しない理由を修正しました。「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)」(大文字と小文字が区別されることに注意してください) になります。

次に、自分で確認するために、Firefox とFirebugを使用します。これにより、JavaScript エラーと AJAX リクエストを簡単に処理できます。Firebug を実行してページを読み込みます。Firebug コンソールで JavaScript エラーを確認します。ライブラリ cfajax.js が見つからないと不平を言っている場合は、おそらく、ColdFusion が同梱されているさまざまな JavaScript ファイルを保持する CFIDE ディレクトリにマッピングする Web サーバーをセットアップする必要があります。

最後に「投票」ボタンをクリックしてください。Firebug で AJAX リクエストをチェックして、何かが発生していることを確認します。応答コードが何であるかを確認してください。200じゃない?Firebug コンソールでリクエストを開いて、レスポンスの HTML を確認します。応答を右クリックして、新しいブラウザー タブで開くことができます。

于 2010-10-09T04:13:02.627 に答える