2014-10-01 54 views
5

我们在我们的SQL查询中虔诚地使用cfqueryparam在常量中使用cfqueryparam

我的一些前任在使用直接值而不是变量时似乎有些过分热情。

是不是

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0"> 

矫枉过正?我的意思是,没有机会进行SQL注入,我不认为在这里使用绑定变量对于提高数据库性能有帮助。难道这不是一样合理吗?

record_is_deleted_bt = 0 

在这种情况下使用cfqueryparam有什么好处,除了根深蒂固的习惯吗?有缺点吗?

+1

我没有意识到这一点。我曾经是那些过分热心的人之一,直到我的一位同事告诉我要加快步伐。 – 2014-10-01 12:51:37

回答

4

不,这不是矫枉过正。 cfqueryparam的第一份工作是数据绑定。它有助于防止SQL注入只是附加奖金。通过数据绑定准备的语句执行速度更快。您错误地认为它只能帮助预防sql攻击。
重要说明: 我正在添加@Dan Bracuk在oracle数据库上提供的测试用例。

<cfquery name="without" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = 1 
</cfquery> 

<cfquery name="with" datasource="burns"> 
select count(*) 
from burns_patient 
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
</cfquery> 

<cfscript> 
TotalWithout = 0; 
TotalWith = 0; 
</cfscript> 

<cfloop from="1" to="1000" index="i" step="1"> 

    <cfquery name="without" datasource="burns" result="resultwithout"> 
    select count(*) 
    from burns_patient 
    where patientid = 1 
    </cfquery> 

    <cfquery name="with" datasource="burns" result="resultwith"> 
    select count(*) 
    from burns_patient 
    where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1"> 
    </cfquery> 

    <cfscript> 
    TotalWithout += resultwithout.executiontime; 
    TotalWith += resultwith.executiontime; 
    </cfscript> 

</cfloop> 

<cfdump var="With total is #TotalWith# and without total is #TotalWithout#."> 

总的范围从700到900毫秒。没有总范围从1800到4500毫秒。无总数总是至少是总数的两倍。

+2

随意证明使用查询parmameters而不是常数可以提高性能的说法。 – 2014-10-01 13:30:24

+1

与cfqueryparam,一个执行计划将被准备,而一个常量它不会,JDBC将只传递整个查询字符串。我相信执行计划的查询会运行得更快。 – 2014-10-01 13:39:22

+0

我想要一个比“我相信”更坚实的东西。 – 2014-10-01 13:40:02