2010-10-08 3 views
0

Maintenant, tout fonctionne mais mon cfc ne met pas à jour la base de données. J'ai essayé de changer le code dans la page de CFC, mais cela soulève juste des erreurs quand j'actualise la page pour la tester. Donc, je sais qu'il appelle la page cfc. Mais quand je clique sur le lien, tout fonctionne sauf mettre à jour la base de données. Qu'ai-je fait de mal?cfajaxproxy/cfc Echec de la mise à jour de la base de données

Voici le code que j'ai trouvé. C'est juste la partie sans vote d'une application de vote Oui/Non. pour garder cette question simple. Suis-je sur la bonne voie? Cela semble être très simple.

lien de 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>  

Modifier Ok pour mettre tout le monde à jour. J'ai enlevé la requête "MemberVote" (oui c'est toujours là dans le code ci-dessus, je l'ai laissé ici pour que tout le monde la voit) juste pour contourner l'erreur et voir comment fonctionne NewCount après avoir ajouté cfc.NewCount(true) comme des orangepips. Ce que je reçois est ceci; Il met à jour la base de données et affiche le NewCount comme il est supposé le faire. Mais une seconde plus tard, la page devient blanche et tout ce que j'ai est le NewCount affiché en haut à gauche (rien d'autre). Firebug ne montre rien et ce que je veux dire est Nothing (vide). Pas de code HTML, CSS, pas de code du tout. D'une manière ou d'une autre, l'ajax se rafraîchit et n'affiche que le NewCount et la page agit comme si elle essayait de lier quelque chose. Ai-je oublié d'ajouter quelque chose pour l'empêcher de rafraîchir ou est-ce autre chose?

J'ai besoin de résoudre ce nouveau problème et l'obtenir pour ajouter le vote des membres à la base de données dans le dans la requête "MemberVote". Des idées?

Répondre

2

Sans voir une erreur réelle, je suppose que votre problème est d'utiliser un nom de variable non délimité comme une fonction. Au lieu de et en mettant cela juste après la balise d'argument. Ensuite, dans votre code, utilisez la variable countNew.

Une autre chose ... s'il vous plaît, plesae, plesae utiliser cfqueryparam dans vos requêtes lorsque vous passez des variables. Cela vous protège des attaques par injection SQL (et améliore les performances). Par exemple:

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

L'erreur était quelque chose que j'ai fait le cfc juste pour voir si elle était même appelée. Ne pas s'inquiéter Sam J'utilise toujours cfqueryparam sur toutes mes requêtes. Je ne les ai pas mis dans mon exemple car je voulais garder le code simple pour que quelqu'un puisse voir ce que j'ai fait de mal. J'ai mis la variable "NewCount" dedans et cela a résolu de mettre à jour le compte dans la base de données mais c'est aussi loin que cela fonctionne. L'insertion de la requête ne fonctionne toujours pas. Je vais essayer des choses différentes et voir si je pourrais obtenir quelque chose de bien. –

0

D'abord, je pense que vous n'êtes jamais appeler la fonction « newcount » dans le composant MyCFC. Comme le montrent les docs cfajaxproxy (http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_a-b_3.html), vous appelez cfajaxproxy, initialisez un objet JavaScript et appelez une méthode sur ce point. objet. Donc dans votre cas ce serait "cfc.NewCount (true)" (notez que ceci est sensible à la casse) après le "cfc.setCallbackHandler (getDataResult);".

Ensuite, pour vérifier vous-même, utilisez Firefox avec Firebug. Cela vous permettra de facilement les erreurs JavaScript et les requêtes AJAX. Chargez votre page avec Firebug en cours d'exécution. Vérifiez la console Firebug pour les erreurs JavaScript. S'il se plaint, il ne peut pas trouver la bibliothèque cfajax.js, alors vous devez probablement configurer un mappage de serveur web vers le répertoire CFIDE - où ColdFusion garde ses divers fichiers JavaScript avec lesquels il est livré.

Enfin, cliquez sur le bouton "Vote". Vérifiez les demandes AJAX dans Firebug pour voir que quelque chose est éteint. Voir ce que le code de réponse est. Pas 200? Ouvrez la demande dans la console Firebug pour voir la réponse HTML. Vous pouvez cliquer avec le bouton droit sur la réponse pour l'ouvrir dans un nouvel onglet du navigateur.

+0

Merci orangepips J'ai mis la variable "NewCount" après le "cfc.setCallbackHandler (getDataResult);" et cela a résolu de mettre à jour le compte dans la base de données, mais c'est aussi loin que cela fonctionne. L'insertion de la requête ne fonctionne toujours pas. J'obtiens maintenant une erreur "Error Executing Database Query". Je vais jouer avec, je pourrais avoir de la chance. Si vous voyez quelque chose s'il vous plaît faites le moi savoir. –

+0

J'ai mis à jour le code ci-dessus et j'ajoute ce qui s'y passe maintenant. –

+0

Il me semble que l'appel cfquery de MemberVote manque de guillemets autour du "N" comme dernière valeur à insérer. Aussi, obtenez-vous quelque chose dans exception.log? – orangepips

0

Ok je fixe le document.write DOM toute écraser en remplaçant:

document.write(result) 

avec ce

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

Cela semble garder le changement au sein du <SPAN ID=" NewCount'> </SPAN> et non ma page d'écraser.

J'ai corrigé pourquoi mon cfc n'ajouterait pas le vote des membres à la base de données dans la requête "MemberVote". Je recevais un "Erreur invoquant CFC: Erreur d'exécution de requête de base de données". J'ai dû ré-étiqueter un champ dans la table. Pour une raison quelconque, l'exécution de la table si le cfc n'a pas fonctionné quand il fonctionne en dehors du cfc.

Questions connexes