如何使用链接来回对ColdFusion查询进行排序?

时间:2011-02-04 15:06:50

标签: sql database sorting coldfusion switch-statement

我有一个ColdFusion页面,它将SQL数据库中的数据显示到表中。在表头中,我设置了链接以对其列中的数据进行排序。问题是,我只能以一种方式对数据进行排序:升序或降序,具体取决于我如何对其进行硬编码。

这就是我设置链接的方式(设置查询以接受排序):

<a href="mypage.cfm?sorter=numb ASC">Number</a>

什么是在ASC和DESC之间切换的简单方法,如果它已经由ASC排序,那么按DESC排序,反之亦然?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

<cfparam name="sortOrder" type="string" default="ASC">

<a href="mypage.cfm?sortColumn=numb&sortOrder=#iif(sortOrder eq "DESC", "'ASC'", "'DESC'"#">Number</a>

答案 1 :(得分:2)

这是我创建的一个小帮助方法,用于处理交换排序。使用只是将列的名称传递给链接中的帮助器,另一个参数用于自定义帮助器:

<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>