2014-05-02 41 views
1

我想仅使用CFScript为ColdFusion组件提供可选参数,同时保持对ColdFusion QueryParam SQL的使用。CFScript和ColdFusion可选参数

例A:从基本user.cfm检索信息对所有用户:

<cfset get = application.controller.getuser()> 

实施例B:任选地,使用相同的方法。 ?从基本用户edit.cfm检索信息编辑= 662B2709-0BA3-42DB-AD2CC29069F4A259为特定用户:

<cfset get = application.controller.getuser(userUID=url.edit)> 

实施例C:可替换地,使用相同的方法,以找到特定的第一名称:

<cfset get = application.controller.getuser(firstname=form.firstname)> 

CFC问题:下面是我controller.cfc。我想维护“AND userUID =:userUID”作为一个可选的CFQueryParam,只有当我的脚本请求时才会出现。

public function getuser(userUID='', password='', firstname=''){ 
    var get = new query(); 

    // query 
    get.setSQL(" 
     SELECT * 
     FROM users 
     WHERE 1 = 1 
     AND  userUID = :userUID 
     AND  firstname = :firstname 
     AND  passhash = :password 
     "); 

    if (len(arguments.userUID) > 0) 
     get.addParam(name = "userUID", value = "#arguments.userUID#", cfsqltype = "cf_sql_varchar");  

    if(len(arguments.firstname) > 0) 
     get.addParam(name = "firstname", value = "#arguments.firstname#", cfsqltype = "cf_sql_varchar"); 

    if (len(arguments.password) > 0) 
     get.addParam(name = "password", value = "#arguments.password#", cfsqltype = "cf_sql_varchar"); 

    return get.execute(); 
} 
+0

使用条件逻辑与你的sql建立一个变量。然后在你的get.setSQL方法中使用该变量。 –

+2

究竟是什么“问题”?你问如何构建SQL字符串?如果是,则有条件地进行构建,就像对待参数一样。然后将最后一个字符串传递给'setSQL(...)'。否则,你能否澄清你的问题?一定要包含任何错误消息。 – Leigh

+0

在你的逻辑中,你可能希望使用'len(trim(arguments.userID))'(和其他变量)当前写入,一个空格(或多个空格)将超过逻辑。 –

回答

7

这样的事情应该让你开始。

sqlString = "select * from users where 1 = 1 "; 
if (len(trim((arguments.userUID)) > 0) 
sqlString &= " AND  userUID = :userUID"; 
etc 

get.setSQL(sqlString); 

请注意,这个答案的查询将返回整个表,如果没有提供参数。您的原始代码也是如此。你可能想考虑处理这种情况。

+0

伟大的答案 - 谢谢你,工程完全按照需要! – myshyzile