Могу ли я использовать cfif в cfquery? - PullRequest
1 голос
/ 09 ноября 2009

Возможно ли использовать <cfif> внутри <cfquery>?

У меня есть <cfquery> в функции, как показано ниже

<cfquery name = "UpdateRecord"   
            dataSource = #arguments.dbSource#   
            username = #arguments.dbUser#   
            password = #arguments.dbPass# 
            result="updateResult" >  
    <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#/cfoutput>
 </cfquery> 

Я хочу проверить TimeoutArgument и сделать так, как показано ниже

<cfquery name = "UpdateRecord"   
                dataSource = #arguments.dbSource#   
                username = #arguments.dbUser#   
                password = #arguments.dbPass# 
                            timeout = #arguments.Timeout#>
                result="updateResult" >  
        <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#/cfoutput>
 </cfquery> 

Тайм-аут является необязательным аргументом, я хочу сделать 1-й запрос как второй запрос, если только тайм-аут пройден. Как я могу это сделать?

Спасибо

Ответы [ 3 ]

7 голосов
/ 09 ноября 2009

Кстати - какой смысл в такой вещи:

<cfquery 
  name       = "UpdateRecord"   
  dataSource = "#arguments.dbSource#"   
  username   = "#arguments.dbUser#"   
  password   = "#arguments.dbPass#" 
  timeout    = "#arguments.Timeout#"
  result     = "updateResult"
>
  <cfoutput>#preserveSingleQuotes(arguments.updateQuery)#</cfoutput>
</cfquery>

Вы передаете каждый бит информации , который делает cfquery, включая фактический код SQL . Это не имеет никакого смысла, вы также можете использовать cfquery тут же, вместо того, чтобы вызывать такую ​​чрезмерно обобщенную функцию. Было бы даже меньше кода.

Кроме того,

  • PreserveSingleQuotes(completeSqlString) отключает любые проверки SQL-инъекций, которые есть у ColdFusion, оставляя эту функцию широко открытой для злоупотреблений и ошибок синтаксиса SQL.
  • <cfoutput> включено по умолчанию в теле тега CF. Следовательно, <cfoutput> является избыточным в приведенном выше.

Абстракция хороша и все такое, но вышесказанное совершенно бессмысленно и опасно.

6 голосов
/ 10 ноября 2009

ПРИМЕЧАНИЕ: Как уже отмечали другие: вы почти наверняка делаете что-то не так и, скорее всего, создаете небезопасное и неэффективное приложение, которое станет кошмаром для обслуживания .


Однако, в ответ на ваш конкретный вопрос, да, вы можете (косвенно) использовать cfif для управления cfquery атрибутами - передавая структуру магическому атрибуту AttributeCollection, например, так:

<cfset var QueryAttributes = StructNew() />

<cfset QueryAttributes.Datasource  = Arguments.dbSource />
<cfset QueryAttributes.Username    = Arguments.dbUser />
<cfset QueryAttributes.Password    = Arguments.dbPass />
<cfif StructKeyExists(Arguments,'Timeout')>
    <cfset QueryAttributes.Timeout = Arguments.Timeout />
</cfif>

<cfquery name="UpdateRecord" result="updateResult"
    AttributeCollection="#QueryAttributes#"
    >
    ...
</cfquery>

(Эта функциональность была введена в CF8.)

5 голосов
/ 09 ноября 2009

Нет, вы не можете использовать cfif в разделе атрибутов cfquery. Однако вы можете установить значение по умолчанию:

<cfargument name="arguments.timeout" default="60" />

Тогда просто используйте запрос с arguments.timeout, как указано. Это будет 60 секунд по умолчанию (или какое-то вменяемое значение). Если пользователь указывает значение, оно будет использоваться вместо этого. На мой взгляд, это лучше, чем иметь два отдельных cfquery утверждения.

liveocs для аргумента .

...