2015-05-01 2 views
1

Я ищу лучший способ создать запрос на основе значений, представленных в форме в coldfusion.Создайте динамический cfquery, используя операторы if - ColdFusion

Я собирался создать его с помощью операторов <cfif>, но приступил к запуску проблем с добавлением запятых после оператора AND, но не добавил, если его последний И в запросе. Также убедитесь, что первое предложение WHERE включено в запрос.

Смотрите мой пример ниже:

<cfquery name="reportInfo" datasource="DataSource1"> 
SELECT * 
FROM Basic_Info 

<cfif company_name NEQ "false"> 
WHERE Sold_to_Party = '#company_name#', 
<cfelse> 
WHERE Sold_to_Party != '', 
</cfif> 

<cfif user_type EQ "both"> 

<cfelseif user_type EQ "rittal"> 

AND Sold_to_Party != 'Distributor Submission', 

<cfelseif user_type EQ "distro"> 

AND Sold_to_Party = 'Distributor Submission', 

</cfif> 

<cfif status NEQ "false"> 

AND Status = '#status#' 

<cfelse> 

AND Status != '' 

</cfif> 


ORDER BY ID 
</cfquery> 

Вы можете видеть, что я добавил ELSEIF заявления в так что я мог бы добавить такое же заявление, без запятой.

+1

Почему вы используете запятых ?? Это недопустимый SQL. – haxtbh

+0

Вы правы, я смешивал его с вставками. И именно поэтому я получил ошибку запятой. Как насчет части WHERE в заявлении? – Denoteone

+0

Вы должны получить деталь 'WHERE', используя то, что у вас есть. – haxtbh

ответ

6

Вам не нужны запятые в предложении WHERE - это недействительно SQL.

При создании динамических предложений SQL WHERE, то быстрый совет состоит в том, чтобы просто иметь предложение 'dummy' where. Вот краткий пример (я не включены все пункты):

<cfquery name="reportInfo" datasource="DataSource1"> 
    SELECT * 
    FROM Basic_Info 
    WHERE 1 = 1 

    <cfif company_name NEQ false> 
     AND Sold_to_Party = <cfqueryparam value="#company_name#" cfsqltype="CF_SQL_VARCHAR"> 
    <cfelse> 
     AND Sold_to_Party != <cfqueryparam value="" cfsqltype="CF_SQL_VARCHAR"> 
    </cfif> 
    <cfif form.user_type EQ "rittal"> 
     AND Sold_to_Party != <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR"> 
    <cfelseif form.user_type EQ "distro"> 
     AND Sold_to_Party = <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR"> 
    </cfif> 
    <cfif status NEQ "false"> 
     AND Status = <cfqueryparam value="#status#" cfsqltype="CF_SQL_BIT"> 
    </cfif> 
    ORDER BY ID 
</cfquery> 

Что-то еще, чтобы быть в курсе, SQL-инъекций. Короче говоря, всегда используйте cfqueryparam, когда вы передаете значения. cfqueryparam защищает вас от SQL-инъекций, а также позволяет механизму базы данных создавать и повторно использовать план выполнения при передаче различным параметрам параметра.

Если вы не уверены, какой cfsqltype значение использовать, то есть удобный список их здесь (для MySQL): http://cfsearching.blogspot.co.uk/2010/01/cfqueryparam-matrix-for-mysql-5.html