2011-06-02 56 views
3

我正在使用:order查询参数将命令参数传递给我的函数。不幸的是,它似乎对输出没有影响。查询参数不像预期的那样行为

请求调试输出显示order参数正确地分析:

Parameter #2(cf_sql_varchar) = posts.createdAt ASC

然而它仍然使以输出没有差别。如果我硬编码参数(ORDER BY ..., #arguments.order#),它工作正常。

任何想法?

public any function getPost(required numeric postId, string order) 
{ 
    switch(arguments.order) 
    { 
     case "new": 
      arguments.order = "posts.createdAt DESC"; 
      break; 
     case "old": 
      arguments.order = "posts.createdAt ASC"; 
      break; 
     default: 
      arguments.order = "posts.score DESC"; 
    } 

    local.post = new Query(dataSource=variables.wheels.class.connection.datasource); 
    local.post.setSql(" 
     SELECT * 
     FROM 
     WHERE posts.id = :postId OR posts.parentId = :postId 
     ORDER BY posts.postTypeId ASC, :order" 
    ); 

    local.post.addParam(name="postId", cfsqltype="cf_sql_integer", value=arguments.postId, maxlength=10); 
    local.post.addParam(name="order", cfsqltype="cf_sql_varchar", value=arguments.order, maxlength=20); 
    local.post = local.post.execute().getResult(); 

    return local.post; 

}

+0

只是一个猜测,尝试使用“order”以外的名称,想知道这是否是解析器扼制的关键字。 – orangepips 2011-06-02 15:10:08

+0

你甚至可以在ORDER BY子句中使用绑定变量吗? – ale 2011-06-02 15:16:06

+0

@orangepips @Al埃弗里特,这将是一个不!看来Al是正确的,你不能将PARAMS绑定到ORDER BY子句。 – Mohamad 2011-06-02 15:50:20

回答

3

如果我没有记错,queryparams不会在任何地方,除了在where子句中使用。所以你没有处理一个错误,而是一个限制。

+1

您也可以在连接语句或选择列表中使用queryparams。它们仅限于你能够在查询中放置SQL变量的位置(因为这是ColdFusion在后台使用queryparams所做的)。 – 2011-06-06 22:32:39

+0

我认为queryParam仅用于在where子句中插入动态值。个人来说,对于这种情况,我会像setQuery(“...”&orderyBy) – LarZuK 2011-06-02 19:49:11