2009-12-01 5 views
0

Pourquoi cela ne fonctionne-t-il pas? Mon message de bienvenue, ça ne se présente pas:Variables de session, messages de bienvenue

<p>Welcome <cfoutput>#Recordset1.UserID#</cfoutput>.</p> 

La variable de session sur la page de connexion que j'ai créé est:

<cflock timeout=999 scope="Session" type="Exclusive"> 
    <cfset Session.IDUsers =''> 
</cflock> 

est ce incorrect? Sur la page d'index où je suis en train d'afficher mon message de bienvenue je:

<cfquery name="Recordset1" datasource="cfGossip"> 
    SELECT * 
    FROM users 
    WHERE users.IDUsers = <cfqueryparam value="#Session.IDUsers#"> 
</cfquery> 

Je ne sais pas si cela fonctionne, ou est-il nécessaire?

Répondre

1

Si vous définissez l'ID utilisateur stocké dans la session comme chaîne vide, lorsque vous l'interrogez, seuls les utilisateurs dont l'ID est la chaîne vide ne doivent pas figurer parmi les utilisateurs. Par conséquent, la requête renvoie un ensemble vide et votre page n'affiche (correctement) pas un ID utilisateur.

Comment identifiez-vous initialement l'utilisateur? Demandez-vous une base de données lors de la connexion? Conservez-vous un cookie? Lire des cartes de Tarot? Pour que cela fonctionne, à un certain moment, vous devez stocker l'ID utilisateur correct, probablement dans la session. Pour ce faire, vous devez d'abord identifier l'utilisateur. En outre, si vous utilisez CF6 +, vous n'avez probablement pas besoin de la commande cflock. Il est maintenant utilisé pour empêcher les conditions de course, CF étant désormais sans danger pour les threads.

+0

Merci pour votre réponse rapide! J'utilise ColdFusion 8, je ferais mieux de l'enlever ensuite, merci. Lorsque l'utilisateur enregistre ses informations dans une base de données MYSQL, et quand il se connecte l'identification vient de là - Chaque utilisateur a un ID et un nom d'utilisateur différents, puis un email et un mot de passe. Je ne suis pas sûr de ce que sont les cartes Tarot, ou comment utiliser les cookies - donc je ne pense pas les utiliser - à moins que les cartes ne soient automatiquement mises en place (?). Comment dois-je le réparer pour que la variable de session ne soit pas pour une chaîne vide? – Bridget

+0

cflock nécessaire uniquement pour la portée application/serveur? – Henry

+0

Vous avez besoin d'un verrou chaque fois que vous pourriez rencontrer des conditions de course. Autrement dit, vous écrivez une valeur spécifique, et si cette valeur est modifiée, les choses se cassent, et d'autres threads peuvent changer cette valeur. Vous n'en avez pas besoin pour la portée de l'application ou la portée du serveur dans des circonstances normales, comme le stockage des données de configuration. –

0

On dirait que vous ne faites que commencer avec les FC, bienvenue dans la communauté.

Ma compréhension de votre code rend le regard de la structure comme ce qui suit, si je vous comprends bien:

<cfset session.idUsers = '' />
<cfquery datasource = "cfgossip" name = "recordset1">
SELECT * FROM USERS WHERE USERS.ID_USERS = <cfqueryparam cfsqltype = "cf_sql_integer" value = "#session.idUsers# />
</cfquery>
<cfoutput>Welcome #recordset1.userID#</cfoutput>

La raison de cette ne fonctionne pas parce que votre valeur session.idUsers est vide. En supposant que vous ayez un utilisateur dans votre base de données avec une valeur ID_USERS égale à 1, vous pouvez modifier le CFSET et afficher les résultats. De plus, bien que je trouve génial de vous voir utiliser CFQUERYPARAM, je vous recommande d'inclure un attribut CFSQLTYPE dans la balise chaque fois que possible pour fournir une ligne de défense supplémentaire contre les attaques par injection. Vous pouvez consulter http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_18.html pour voir la liste des types disponibles.

+0

OK, vous êtes nouveau. Je n'ai jamais fait de site avec Dynamic Development auparavant! C'est vraiment difficile à apprendre, j'ai trouvé ce site très utile - les gens vous aident énormément ici! Mais je ne suis pas assez bon pour répondre aux questions de quelqu'un d'autre - alors j'espère que les gens n'arrêteront pas de m'aider à penser que je suis juste un "leacher" si vous savez ce que je veux dire. lol. De toute façon, en changeant le cfset, vous voulez dire mettre une valeur dans le '' in = ''. Parce que je veux qu'il obtienne l'ID pour l'utilisateur connecté, pas toujours la même valeur, donc je ne suis pas sûr de la valeur à mettre. Toute idée? merci, B. – Bridget

+0

Oh, pas de soucis - la communauté ColdFusion est toujours heureuse de vous aider. Essentiellement, lorsque vos utilisateurs soumettent le formulaire de connexion, et dans le code qui détermine que l'utilisateur s'est connecté avec succès, c'est là que vous allez vouloir définir la valeur de session.idUsers pour être l'ID utilisateur. Sur cette page d'accueil, cependant, vous voudrez un pour vous assurer qu'il a quelque chose à utiliser au cas où quelqu'un ne se serait pas encore connecté, et alors vous pouvez vérifiez si vous avez un nombre d'enregistrements (via ) pour afficher le message de bienvenue. –

0

Y a-t-il quelque part dans votre code où vous définissez votre session.IDUsers? Vous l'initialisez comme un blanc ''. Coldfusion ne le peuplent pas pour vous. La portée de session est un endroit qui se rappellera des choses pour cet utilisateur que vous mettez là pour une période d'inactivité spécifiée, habituellement 20 minutes. Donc, j'espère, quelque part avant d'exécuter votre requête, vous avez une logique supplémentaire qui remplit cela, sinon vous demandez à la base de données d'un utilisateur nommé ''.

Ceci est juste un point de style, mais ce qui suit peut travailler mieux pour vous:

<cfset Session.IDUsers =''> 

<!--- Do something here to populate Session.IDUsers ---> 

<!--- Creates a blank query - not necessary, but can reduce errors later ---> 
<cfset Recordset1 = queryNew("UserID")> 

<!--- Populate the query from the database ---> 
<cfquery name="Recordset1" datasource="cfGossip"> 
    SELECT * 
    FROM users 
    WHERE users.IDUsers = <cfqueryparam value="#Session.IDUsers#"> 
</cfquery> 

<!--- If the query has data, use it, otherwise show generic message ---> 
<cfoutput> 
<cfif Recordset1.recordcount> 
    <p>Welcome #Recordset1.UserID#.</p> 
<cfelse> 
    <p>Welcome new user!</p> 
</cfif> 
</cfoutput> 

<!--- OR since we used queryNew("userID"), we can simplify without throwing an error. ----> 
<cfoutput> 
    <p>Welcome <cfif len(Recordset1.userID)>#Recordset1.userID#.<cfelse>new user!</cfif></p> 
</cfoutput> 

Mettre le cfoutput en dehors du bloc de paragraphe sera plus facile si vous avez des variables supplémentaires à insérer dans le texte.Quoi qu'il en soit, à moins que vous n'ayez oublié de partager un peu plus du code, je pense que le problème est que le fichier session.IDUsers est vide et doit être rempli avant la requête. J'espère que ça aide!