将cfqueryparam与常量一起使用

时间:2014-10-01 12:43:27

标签: coldfusion cfqueryparam

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

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

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

矫枉过正?我的意思是,没有机会进行SQL注入,我认为在这里使用绑定变量不会对提高数据库性能做任何帮助。

这样做是不合理的
record_is_deleted_bt = 0

在这种情况下使用cfqueryparam是否有任何好处,除了习惯使用它?有缺点吗?

1 个答案:

答案 0 :(得分:4)

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

<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毫秒。没有总数至少是总数的两倍。