如果将作用域的名称用作查询列,则如何访问作用域

时间:2013-08-24 00:59:28

标签: url coldfusion scope cfquery

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

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

作为一个临时用户,我们正在使用isDefined(“url.key”),但我仍然想知道是否有办法打破查询范围。

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

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

以下示例中有许多页面将被视为“pageA”。足够改变事物的运作方式需要及时改变范围和投资,而这在时间上是不会发生的。

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

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

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

5 个答案:

答案 0 :(得分:3)

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

<cfset urlScope = url>

<cfoutput query="x">
  <cfset keyExists = structKeyExists(urlScope, "key")>
</cfoutput>

答案 1 :(得分:3)

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

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


然而,有一个无证(意思是不支持和可能改变)选项。如果你转储getPageContext(),你会看到一堆做有趣事情的函数,包括处理范围。

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

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

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

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

答案 2 :(得分:1)

我的解决方案始终是将查询中的url列别名为int

SELECT URL as qURL FROM myTable ...

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

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

答案 3 :(得分:0)

你不能在cfoutput块之外移动structKeyExists(url,“key”),并将其存储到变量中吗?或者执行structAppend将url结构复制到另一个名为other else的结构中?

答案 4 :(得分: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