2016-07-27 5 views
0

что лучший способ делать то, что я сделал в <cfquery> даже в queryExecutecfquery в queryExecute: если внутри строки SQL

cfquery

<cfquery name="qry"> 
    SELECT * FROM tbl_products 
    WHERE filed1 = 1 

    <cfif structKeyExists(URL, "test")> 
     AND filed2 = 2 
    </cfif> 

    ORDER BY id DESC 
</cfquery> 

cfexecute

<cfscript> 

    sql = " 
     SELECT * FROM tbl_products 
     WHERE filed1 = 1 
     ORDER BY id DESC 
    "; 

    if (structKeyExists(URL, "test")){ 
     sql = " 
      SELECT * FROM tbl_products 
      WHERE filed1 = 1 
      AND filed2 = 2 
      ORDER BY id DESC 
     "; 
    } 

    qry = queryExecute(
     sql = sql 
    ); 

</cfscript> 

I надеюсь, что я хорошо объяснил ...

ответ

6

Необходимо создать строку SQL. Также хорошо стоит передать значения param, чтобы вы были защищены от SQL-инъекции. Что-то вроде:

<cfscript> 
params = {}; 

sql = " 
    SELECT * FROM tbl_products 
    WHERE filed1 = :filed1 
"; 
params["filed1"] = 1; 

if (structKeyExists(URL, "test")){ 
    sql &= "AND filed2 = :filed2 "; 
    params["filed2"] = 2; 
} 

sql &= "ORDER BY id DESC"; 

queryExecute(sql, params); 
</cfscript> 

В качестве альтернативы вы можете использовать позиционные параметры.

<cfscript> 
params = []; 

sql = " 
    SELECT * FROM tbl_products 
    WHERE filed1 = ? 
"; 
arrayAppend(params, 1); 

if (structKeyExists(URL, "test")){ 
    sql &= "AND filed2 = ? "; 
    arrayAppend(params, 2); 
} 

sql &= "ORDER BY id DESC"; 

queryExecute(sql, params); 
</cfscript> 

Это один из тех случаев, когда теги лучше, чем скрипты.

+0

Спасибо. Я думал, что так делаю. Я надеялся, что есть какой-то «трюк», который можно решить каким-то другим «чистым» способом: D – Ivan