【问题标题】:CFML if/else statement acting weird under Coldfusion 6CFML if/else 语句在 Coldfusion 6 下表现怪异
【发布时间】:2014-01-10 03:33:34
【问题描述】:

我有以下非常简单的 if/else 语句:

<cfif Server.ColdFusion.ProductVersion GTE "7">
        <cfoutput>#encrypt("Test text", "77qidrWFoQg96taobooCm3/WimS2Gcdd", "DESEDE", "Hex")#</cfoutput>
<cfelse>
        <cfoutput>#encrypt("Test text", "77qidrWFoQg96taobooCm3/WimS2Gcdd")#</cfoutput>
</cfif>

应该在 CF 7、8、9、10 下工作,但不能在 CF 6 下工作(>7)。

有什么想法吗?我尝试了很多很多不同的选项和相同的结果。 CF 6 让我绝望。 附言不,我为其编写了一些脚本的客户还不会迁移到更高版本。

【问题讨论】:

  • 您不应该将主要产品版本提取为数字并将其与7 而不是"7" 进行比较,如“7”>“10”但 7
  • 我也试过cfif Server.ColdFusion.ProductVersion GTE 7,同样的结果;我也试过&lt;cfset coldfusionVersion=Replace(Replace(ListDeleteAt(Server.ColdFusion.ProductVersion,4),",","","all")," ","","all")&gt; 然后&lt;cfif coldfusionVersion GTE 700&gt; 结果相同:-|
  • 我什至尝试了&lt;cfif Server.ColdFusion.ProductVersion LT 7&gt;,结果相同,CF 6 只是忽略了我的&lt;cfif&gt; 并执行不适合其版本的代码...
  • cfdump Server.ColdFusion.ProductVersion 会发生什么?
  • 对所有人来说......它与条件无关,尽管它不会像写的那样工作。由于加密的使用方式,它只是无法编译。请参阅下面的答案。

标签: coldfusion cfml


【解决方案1】:

ColdFusion 正在尝试编译该页面,但它无法编译,因为您对 encrypt 函数使用了无效的语法。 CF 6 不允许将这些参数传递给encrypt。如果您需要支持 CF6,我建议您使用 &lt;cfinclude&gt; 语句来包含后 CF6 代码。所以像:

<cfif listfirst(server.coldfusion.productversion) gte 7>
  <cfinclude template="cf7encrypt.cfm" />
<cfelse>
  <cfinclude template="cf6encrypt.cfm" />
</cfif>

然后,您可以在两个 cfm 文件中包含版本特定的加密调用。然后它会正确编译。

另一种选择是使用两个不同的 CFC 作为包装器进行加密(一个用于 CF6,一个用于 CF7+),然后加载正确的 CFC 并调用加密函数。无论哪种情况,关键是从主模板中获取对encrypt() 的无效调用。

【讨论】:

  • 阅读您收到的错误消息。它说它是加密的参数错误。 Encrypt 在 CF6 上不支持超过 2 个参数。仅仅因为您将其包装在 CFIF 中并不意味着它不会被编译。这不是有条件的。相信我。
  • 看它是因为它是一种编译语言。该页面被编译成 Java 字节码,然后执行。它无法编译它不理解的语法,并且它不理解传递超过 2 个参数来加密。
  • .. 即它与cfif 无关。编译!=执行
  • 在 C、Java 等其他编译语言中是完全一样的。 Python 和 ruby​​ 被解释。因此有区别。随意研究自己的差异。在某些时候,CF 允许您提供比函数预期更多的参数,它会忽略它们。但是,这与我所解释的不同。 8、9、10 等仍然会首先将代码编译为 Java 字节码,无效的语法仍然会引发编译时错误。然而,他们改变了它,使额外的参数不再是“无效的语法”。我不记得是哪个版本做出了这种改变
  • 只是为了强化 Sean 和 Leigh 所说的话:他们完全正确。整个文件需要在语法上对它正在编译的 ColdFusion 版本有效。而且......呃......它实际上甚至说它是堆栈跟踪顶部的编译(/解析)错误,dunnit?
猜你喜欢
  • 2016-11-18
  • 2022-07-22
  • 2018-07-14
  • 2019-04-09
  • 2017-10-28
  • 2012-06-30
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多