处理一些遗留代码时,我们遇到了一个相当恼人的情况。我们使用<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范围作为变量访问。
答案 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