你如何在ORDER BY子句中使用cfqueryparam?

Chr*_*ndt 7 sql coldfusion cfquery cfqueryparam

我正在努力成为一名优秀的CF Web开发人员,并使用<cfqueryparam>所有FORM或URL元素来实现我的SQL查询.

在这种情况下,我试图允许用户动态控制ORDER BY子句.

<cfquery datasource="MyDSN" name="qIncidents">
  SELECT IncidentID, AnimalID, IntakeDate, DxDate, OutcomeDate
  FROM Incidents
  WHERE ShelterID = <cfqueryparam cfsqltype="cf_sql_integer" value="#Arguments.ShelterID#">
  ORDER BY <cfqueryparam cfsqltype="cf_sql_varchar" value="#SortBy#">
</cfquery>
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误:

由ORDER BY编号1标识的SELECT项包含一个变量,作为标识列位置的表达式的一部分.只有在引用列名的表达式进行排序时,才允许使用变量.

有关如何安全地做到这一点的任何建议?

Clo*_*sic 12

遗憾的是,您不能直接在Order By子句中使用CFQUERYPARAM.

如果要动态使用Order By但仍然安全地使用Order By,则可以设置CFSWITCH或类似结构以根据某些条件(例如,URL变量)更改SortBy变量.与往常一样,不要直接从用户传递任何值,只需查看用户的输入并根据该输入从预定的可能值列表中进行选择.然后,只需使用标准语法:

ORDER BY #SortBy#
Run Code Online (Sandbox Code Playgroud)

  • 思考你能够和不能使用cfqueryparam的一个好方法是根据数据库中的数据来考虑它.sortBy变量代替列,而不是列中的数据.您也无法使用查询参数来参数化表或列列表. (2认同)