2011-02-04 42 views
0

我有一個將SQL數據庫中的數據顯示到表中的ColdFusion頁面。在表頭中,我設置了鏈接來對列中的數據進行排序。問題是,我只能以一種方式對數據進行排序:升序或降序,取決於我如何硬編碼才能執行。如何通過鏈接對ColdFusion查詢進行排序?

這是我如何我的鏈接設置(與查詢設置爲接受排序):

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

什麼簡便的方法,使之ASC和DESC之間切換,因此,如果它已經排序通過ASC,然後按DESC排序,反之亦然?

+0

你試過CFGRID? – Henry 2011-02-04 18:17:38

+1

我希望你不要把#URL.sorter#直接放在你的查詢中。這是一個到SQL注入的快速途徑。 – ale 2011-02-05 03:33:27

回答

2

你可以做類似如下:

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

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

現在,我會告訴你,你的方法目前正在同列做並在一個變量訂單是EXTREMELY危險。我強烈建議你按照我的鏈接示例並將列和順序拆分爲兩個變量。

爲什麼?它使得添加安全非常容易。在鏈接引發的頁面上(在本例中爲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> 
相關問題