Coldfusion #iif和session

时间:2011-04-11 08:37:56

标签: coldfusion conditional iif

我正在追加添加/编辑用户表单,当访问该页面时,会有一个if语句,用于检测我们是在编辑当前用户还是通过url id添加新用户

<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 个答案:

答案 0 :(得分:3)

首先 - 如果你可以避免使用iif(),那么就这样做。它引起的问题比以往任何时候都要严重得多......

但是,请注意关于iif()的ColdFusion文档中的以下内容:

  

如果变量未定义,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" />

答案 1 :(得分:0)

为什么你需要为同一个项目提供两个不同的变量名称?你能做到吗:

<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

Ĵ

答案 2 :(得分:0)

几个问题:

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解析。

答案 3 :(得分:0)

您看到的问题是IIF()必须评估语句的所有部分。 您无法真正使用它来检查是否定义了变量,因为它总是会尝试评估真实和错误响应的内容。

只要您在使用IIF()时牢记这一点,使用它就没有问题。只是保持简单,不要在变量可能不存在时尝试使用它。

我要指出代码中的其他问题,但其他答案已经很好地涵盖了这些问题。