3

在处理一些遗留代码时,我们遇到了一个相当烦人的情况。我们正在循环一个带有<cfoutput query="x">标签的查询。该查询有一个名为“url”的列。在该循环中,我们需要检查 url 范围内是否存在键。由于 CF 优先考虑查询中的内容而不是一般页面范围,因此我不能使用 a structKeyExists(url,"key"),因为此时就 CF 而言, url 是一个字符串,其值来自查询的当前行。

如何突破查询范围并检查我的 url 中的内容?

作为临时我们使用 isDefined("url.key"),但我仍然想知道是否有办法突破查询范围。

如果没有几个小时的工作来跟踪更改对它的所有引用,也无法真正更改列,甚至查询中的列名,因此我们将尽可能避免这种情况。

编辑:对于如何设置此代码以及为什么简单的解决方案不适用似乎有些混乱。我很难给出一个完整的例子,但我会尽力澄清情况。

对于以下示例,有许多页面可以算作“pageA”。改变事情的运作方式就需要改变范围和时间投资,而这在分配的时间内不会发生。

PageA 使用名为 url 的列之一运行查询,然后通过 cfoutput 启动输出循环,在该循环内包含 PageB。一个 PageA 在 URL 范围内的变量可能与另一个 PageA 不同,实际上它们是相同的,但可能命名不同(varID=x 在一种情况下 vid=x 在另一种情况下)。在 PageB 内部,我需要使用该 url 范围内的值,因此我想遍历不同的可能名称(如果 url 中存在键“varID”,则使用它,否则使用“vid”)。

这就是为什么我想“穿透”查询范围以获取 url 结构,而不是查询中的 url 列。任何其他方法似乎都需要修改许多 PageAs。

所以问题不是如何具体解决这个问题,因为有很多方法可以做到,我真的很想避免它们,因为它们都会在实现和测试中增加大量时间。问题仍然存在,如果 url 作为查询列存在并且您在查询范围内,是否有办法将 url 范围作为变量访问。

4

5 回答 5

3

一种解决方案是将url结构分配给标记外部的新变量cfoutput,然后引用该变量而不是url. 例子:

<cfset urlScope = url>

<cfoutput query="x">
  <cfset keyExists = structKeyExists(urlScope, "key")>
</cfoutput>
于 2013-08-24T02:55:47.477 回答
3

我认为创建一个返回 url 范围的函数可能会起作用,但是在测试它时,即使使用本地范围的查询(这会阻止函数使用查询本身),url函数内部的使用仍然被破坏:

<cffunction name="getUrlScope"><cfreturn Url /></cffunction>
...
<cfoutput query="x">
<cfif StructKeyExists( getUrlScope() , 'key' )>
    <!--- still fails :( --->


但是,有一个未记录的(意味着不受支持且可能会更改)选项。如果你转储getPageContext(),你会看到一堆做有趣事情的函数,包括处理作用域。

您可以使用getPageContext().SymTab_findBuiltinScope('URL')获取 URL 范围。

您还可以使用getPageContext().getCfScopes()来获取范围数组。我不确定订单是否保证固定,但它似乎是 [cgi,?,url,form,cookie,?] 检查 CF10 和 cflive (CF9),所以可能是。

(在 CF8 中有方法 getBuiltinScopes,它返回一个结构而不是一个数组 - 这似乎不再存在,加强了这些方法的整个不受支持和可变的性质。)

在 Railo 上,这些不起作用,但getPageContext.UrlScope()其他范围有类似名称的函数。

于 2013-08-24T18:28:24.550 回答
1

我对此的解决方案总是将查询中的 url 列别名为 int

SELECT URL as qURL FROM myTable ...

如果您无权访问查询(它是存储的程序或使用 elswhere 等),您始终可以使用查询的查询来使用您的别名重新选择它。

我不关心在输出之外创建对 URL 的单独引用的想法——但这也可以。我只想知道什么是用户输入(即来自 URL 或 FORM)以及内部生成的内容(即来自查询)。

于 2013-08-24T16:25:25.380 回答
0

另一种方法是用 cfloop 块替换您的 cfoutput 块。

<cfloop from="1' to = "#YourQuery.recordcount#" index = "idx">
<cfif StructKeyExits(url,"key")>
<cfoutput>
#url.key# is not the same as #YourQuery.url[idx]#
which can also be referenced like this #YourQuery["url"][idx]
etc
于 2013-08-24T10:34:47.810 回答
0

您不能将 structKeyExists(url,"key") 移到 cfoutput 块之外,并将其存储到变量中吗?或者做一个 structAppend 将 url 结构复制到另一个名为别的结构的结构中?

于 2013-08-24T01:09:49.287 回答