Coldfusion #iif 和会话

问题描述 投票:0回答:4

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

元素 team.name 在会话中未定义。为什么在满足第一个条件时评估会话是否存在?

谢谢,

R.

coldfusion conditional-statements iif
4个回答
3
投票

首先 - 如果您可以避免使用 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
投票

为什么同一个项目需要两个不同的变量名称,是否有原因? 你可以这样做吗:

<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


0
投票

几个问题:

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.