【发布时间】:2014-12-26 14:45:07
【问题描述】:
我基本上想允许这样的事情:
<cf_datatables datasource="#someDS#">
<cf_datatables_records>
SELECT
`someColumn1`,
`someColumn2`
FROM
`#someDB#`.`#someT#`
WHERE
`someColumn1` = <cfqueryparam value="#someValue#" cfSqlType="CF_SQL_INTEGER">
LIMIT
10
</cf_datatables_records>
</cf_datatables>
cf_datatables_records 自定义标签(子)是一个子查询/记录集,将在cf_datatables 自定义标签(父)中使用。这将是执行上述操作时的 SQL 结果:
SELECT
SQL_CALC_FOUND_ROWS *
FROM (
SELECT
`someColumn1`,
`someColumn2`
FROM
`#someDB#`.`#someT#`
WHERE
`someColumn1` = <cfqueryparam value="#someValue#" cfSqlType="CF_SQL_INTEGER">
LIMIT
10
) AS `base`
UNION (...)
WHERE ... GROUP BY ... ORDER BY ... LIMIT ... etc. (depends on the provided parameters)
不幸的是,ColdFusion 在将 cfqueryparam 标签传递给自定义标签之前先对其进行解析,导致:
Context validation error for tag cfqueryparam. The tag must be nested inside a cfquery tag.
如果我省略cfqueryparam,它确实有效,但这显然是不可接受的。解析查询参数也是如此。
知道如何解决这个问题吗?
【问题讨论】:
-
不确定为什么会存在这些自定义标签。这就像对 cfquery 的重写,效果很好。我认为您无法解决此问题,除非您重写数据表自定义标记以在最终将其放入 cfquery 标记的位置包含 cfqueryparam。除了额外的解析开销之外,您不会从使用此自定义标记中获得任何好处。
-
AFAIK,这对于标签是不可能的。可能与 cfquery 的 cfscript 版本一起使用。但是,我也不确定我是否看到了这个的价值。用例是什么?旁注,根据
#foo2#和#foo3#的来源,您仍然可能将数据库暴露给sql 注入。 -
目的是简化必须准备数据的方式。我希望我们的初级开发人员只关心记录,而不是动态过滤、确定可能的记录计数等附加信息所需的子选择。
-
我发布的代码是通用的,只是描述了我想做的事情,也就是一个例子,所以实际的事情不仅仅是构建两个查询。一种可能的解决方案是通过参数传递查询,但这需要了解子选择,除非我愿意触发两倍的查询,即查询时查询。
-
更好的方法可能是编写可供初级开发人员使用的存储过程。这将满足只处理记录的要求。
标签: coldfusion nested cfquery custom-tags cfqueryparam