2014-05-02 2 views
1

Я хотел бы предоставить необязательные аргументы для компонента ColdFusion, используя только CFScript, сохраняя при этом использование ColdFusion QueryParam SQL.Дополнительные аргументы CFScript и ColdFusion

Пример А: Получение информации от базовой user.cfm для всех пользователей:

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

Пример B: Необязательно, используя тот же метод. ? Получение информации от базовой пользовательского edit.cfm редактировать = 662B2709-0BA3-42DB-AD2CC29069F4A259 для конкретного пользователя:

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

Пример С: С другой стороны, используя тот же метод, чтобы найти конкретный первый имя:

<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