我正在追加添加/编辑用户表单,当访问该页面时,会有一个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上。
答案 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()时牢记这一点,使用它就没有问题。只是保持简单,不要在变量可能不存在时尝试使用它。
我要指出代码中的其他问题,但其他答案已经很好地涵盖了这些问题。