条件语句- Coldfusion #iif和sessions



我正在构建一个添加/编辑用户表单,当页面被访问时,有一个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 .

首先—如果您可以避免使用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" />

是否有理由为同一项使用两个不同的变量名?

<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

几个问题:

1)

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

你在这里要求SQL注入。使用cfqueryparam

2)

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

这是你的第二篇文章,我注意到#

的奇怪用法

应该像Jason写的那样:

<cfset name = getSquadMember.athlete_name />
关于你的问题:
<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时,整个东西可能需要是正确的。另一个问题是,你不需要在这里使用input。正常的HTML输入将完成并节省一些CF解析。

您看到的问题是IIF()必须计算语句的所有部分。你不能真的用它来检查一个变量是否定义,因为它总是试图计算true和false响应的内容。

只要在使用IIF()时记住这一点,使用它就没有问题。只要保持简单,不要试图在变量可能不存在的情况下使用它。

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

相关内容

  • 没有找到相关文章

最新更新