0

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

元素小队名称在会话中未定义。为什么在满足第一个条件时评估会话是否存在?

谢谢,

R。

4

4 回答 4

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

于 2011-04-11T09:10:43.340 回答
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 语句的需要

高温高压

Ĵ

于 2011-04-11T09:00:22.383 回答
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 解析。

于 2011-04-11T09:14:33.080 回答
0

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

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

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

于 2011-04-11T09:20:17.203 回答