Переменные сессии, приветственные сообщения - PullRequest
0 голосов
/ 02 декабря 2009

Почему это не работает? Мое приветствие, оно просто не отображается:

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

1 голос
/ 02 декабря 2009

Если в качестве идентификатора пользователя, хранящегося в сеансе, задать пустую строку, то при запросе к ней вы получите только тех пользователей, для которых идентификатор представляет собой пустую строку, которых не должно быть. Таким образом, запрос возвращает пустой набор, и ваша страница (правильно) не отображает идентификатор пользователя.

Как вы изначально идентифицируете пользователя? Вы запрашиваете базу данных, когда они входят? Вы храните печенье? Чтение карт Таро? Чтобы это работало, в какой-то момент вы должны сохранить правильный ID пользователя, вероятно, в сеансе. Для этого вам необходимо сначала определить, кто пользователь.

Кроме того, если вы используете CF6 +, вам, вероятно, не нужен cflock. Теперь он используется для предотвращения условий гонки, так как CF теперь потокобезопасен.

0 голосов
/ 03 декабря 2009

Есть ли где-нибудь в вашем коде, где вы устанавливаете свой 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 пуст и должен быть заполнен перед запросом. Надеюсь, это поможет!

0 голосов
/ 02 декабря 2009

Похоже, вы только начинаете с 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, чтобы увидеть список доступных типов.

...