这是我创建的一个小辅助方法,用于处理交换排序。要使用仅将列的名称传递给链接中的帮助程序,另一个参数用于自定义帮助程序:
<a href="mypage.cfm?sortby=numb&sortorder=#swapSortOrder('numb')#">Number</a>
<cffunction name="swapSortOrder" returntype="string">
<cfargument name="column" type="string" required="true">
<cfargument name="sortByParams" type="string" required="false" default="sortby">
<cfargument name="sortOrderParams" type="string" required="false" default="sortorder">
<cfargument name="ascending" type="string" required="false" default="asc">
<cfargument name="descending" type="string" required="false" default="desc">
<cfif
!StructKeyExists(url, arguments.sortByParams)
OR !StructKeyExists(url, arguments.sortOrderParams)
OR arguments.column NEQ url[arguments.sortByParams]
OR url[arguments.sortOrderParams] eq arguments.descending
>
<cfreturn arguments.ascending>
</cfif>
<cfreturn arguments.descending>
</cffunction>
现在我要告诉你这一点,你目前在一个变量中使用列和顺序的方式是极度危险的。我强烈建议您按照我的链接示例将列和顺序拆分为两个变量。
为什么?它使添加安全性变得非常容易。在链接抛出的页面(在本例中为 mypage.cfm)上,您需要过滤 sortby 和 sortorder 变量以防止 sql 注入攻击。
我通常做的是创建一个人们可以排序的已知列列表,然后对其进行过滤:
<cfset _columns="numb,title,name,phone,email">
<cfif !ListFindNoCase(_columns, url.sortby)>
<cfset url.sortby = "title">
</cfif>
排序顺序也是如此:
<cfset _order = "asc,desc">
<cfif !ListFindNoCase(_order, url.sortorder)>
<cfset url.sortorder = "asc">
</cfif>