Coldfusion #iif и сеансы - PullRequest
       14

Coldfusion #iif и сеансы

0 голосов
/ 11 апреля 2011

Я создаю форму добавления / редактирования пользователя, когда к странице обращаются, есть оператор if, который определяет, редактируем ли мы текущего пользователя или добавляем нового пользователя по URL-адресу

<cfif isDefined('URL.id')>

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=#URL.id#
</cfquery>
<cfset #name#=#getSquadMember.athlete_name# />



<cfelse>
<cfset SESSION.squad = structNew()>
<cfparam name="SESSION.squad.name" default="">
</cfif>

Это нормально, но проблема заключается в оценке, если сеанс или значение существует, я получаю ошибку

<cfinput  class="text" name="name" type="text" id="name" value ="#IIf(IsDefined('name'), DE('#name#'), DE("#SESSION.squad.name#"))#" required="yes"  />

Элемент squad.name не определен в сеансе.Почему он элюирует, если сеанс существует, когда выполняется первое условие?

Спасибо,

R.

Ответы [ 4 ]

3 голосов
/ 11 апреля 2011

Сначала - если вы можете избежать использования iif (), тогда сделайте это. Это вызывает гораздо больше головных болей, чем когда бы то ни было ...

Однако обратите внимание на следующее из документации ColdFusion для iif ():

Если переменная не определена, ColdFusion выдает ошибку при обработке этой функции. В следующем примере показана эта проблема:

#IIf(IsDefined("Form.Deliver"), DE(Form.Deliver), DE("no"))# This returns "Error resolving parameter FORM.DELIVER".

Чтобы избежать этой проблемы, используйте функции DE и Evaluate в коде, таком как следующее:

#IIf(IsDefined("Form.Deliver"), Evaluate(DE("Form.Deliver")), DE("no"))# This returns "no"; ColdFusion does not throw an error.

Или, если вы используете CF9 (который поддерживает троичные операторы):

<cfinput class="text" name="name" type="text" id="name" value ="#IsDefined('name') ? name : SESSION.squad.name#" required="yes" />

0 голосов
/ 11 апреля 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что IIF () должен оценить все части утверждения. Вы не можете использовать его для проверки, определена ли переменная или нет, так как он всегда будет пытаться оценить содержимое как истинных, так и ложных ответов.

Пока вы помните об этом при использовании IIF (), нет проблем с его использованием. Просто будьте проще и не пытайтесь использовать его, когда переменная может не существовать.

Я собирался указать на другие проблемы с вашим кодом, но другие ответы уже сделали хорошую работу по их устранению.

0 голосов
/ 11 апреля 2011

Пара вопросов:

1)

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=#URL.id#
</cfquery>

Вы просите ввести SQL-код здесь. Используйте cfqueryparam

2)

<cfset #name#=#getSquadMember.athlete_name# />

Это ваш второй пост, где я замечаю странное использование #

Должно быть так, как написал Джейсон:

<cfset name = getSquadMember.athlete_name />

3) По вашему вопросу:

<cfinput class="text" name="name" type="text" id="name" value="#IIf(IsDefined('name'), DE('#name#'), DE("#SESSION.squad.name#"))#" required="yes" />

Этот способ не совсем читабелен. Сначала установите некоторую переменную для значения. Второе - вам не нужно помещать переменные в DE следующим образом:

DE(name)

И так как вы используете cfinput, вероятно, все должно быть правильно. И еще одна проблема - вам не нужно использовать cfinput там. Обычный ввод HTML поможет вам сэкономить при разборе CF.

0 голосов
/ 11 апреля 2011

Есть ли причина, по которой вам нужно иметь два разных имени переменной для одного и того же элемента?Не могли бы вы просто сделать:

<cfif isDefined('URL.id')>

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=<cfqueryparam value="#URL.id#" cfsqltype="CF_SQL_INTEGER" />
</cfquery>
<cfset name= getSquadMember.athlete_name />

<cfelse>
<cfset squad = structNew()>
<cfset name = "" />
</cfif>
<input type="text" name="name" id="name=" value="#name#" />

Что, в свою очередь, устранит необходимость в выражении iff

HTH

J

...