会话变量,欢迎消息

时间:2009-12-01 23:54:43

标签: coldfusion

为什么这不起作用?我的欢迎辞,它只是没有出现:

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

我创建的登录页面上的会话变量是:

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

这是不正确的?在我正在尝试显示欢迎消息的索引页面上,我有:

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

我不确定这是否有效,或者是否有必要?

3 个答案:

答案 0 :(得分:1)

如果将存储在会话中的用户ID设置为空字符串,则在查询时,只会获得id为空字符串的用户,该字符串不应为其中任何一个。因此,查询返回一个空集,并且您的页面(正确地)不显示用户ID。

您最初是如何识别用户的?您是否在登录时查询数据库?你在存储cookie吗?读塔罗牌?为此,在某些时候,您必须存储正确的用户ID,可能在会话中。为此,您需要首先确定用户是谁。

另外,如果您使用的是CF6 +,则可能不需要cflock。它现在用于防止竞争条件,因为CF现在是线程安全的。

答案 1 :(得分:0)

看起来你刚刚开始使用CF,欢迎来到社区。

如果我理解正确的话,我对你的代码的理解会使结构如下所示:

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

这不起作用的原因是因为您的session.idUsers值为空。假设您的数据库中有一个ID_USERS值为1的用户,您可以将CFSET更改为类似,并返回结果。

此外,虽然很高兴看到您使用CFQUERYPARAM,但我建议尽可能在标记中包含CFSQLTYPE属性,以提供针对注入攻击的额外防线。您可以查看http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_18.html以查看可用类型列表。

答案 2 :(得分:0)

您的代码中是否有设置session.IDUsers的地方?您将其初始化为空白''。 Coldfusion不会为你填充它。会话范围是一个会记住您在那里放置指定时间段不活动的用户的事情,通常是20分钟。所以希望,在你运行查询之前的某个地方你有额外的逻辑来填充它,否则你要求数据库中有一个名为''的用户。

这只是一种风格,但以下内容可能对你更有效:

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

如果要在文本中插入其他变量,那么将cfoutput放在段落块之外会更容易。 (但会以任何方式工作)

无论如何,除非您忘记分享更多代码,否则我认为问题是session.IDUsers是空白的,需要在查询之前填充。我希望这有帮助!