【问题标题】:How can I sort a ColdFusion query back and forth with a link?如何使用链接来回排序 ColdFusion 查询?
【发布时间】:2011-02-04 15:06:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我希望您不要将#URL.sorter# 直接放在您的查询中。这是 SQL 注入的快速途径。

标签: sql database sorting coldfusion switch-statement


【解决方案1】:

您可以执行以下操作:

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

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

【讨论】:

  • 我的意思是 iif。我的 sn-p 中有一个错字(缺少括号)。它应该是:'Number'
  • 似乎仍然不起作用。而不是“.cfm?sortColumn”我有“.cfm?sorter”,因为我的 url.sorter 定义在顶部。
  • 如果您在查询中使用“ORDER BY #sortColumn# #sortOrder#”,它将起作用。我认为使用这两个单独的参数而不是单个“排序器”参数更健壮。 de() 是延迟评估函数,在此 iif 中是必需的。如果愿意,您可以使用普通的 if/else 子句。
  • 对于查询我有 ?
  • @wahle509 - 正如 Al Everett 和 rip747 所说,在查询中使用 url 变量是 sql 注入的秘诀。请务必先清除这些值。
【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多