5

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

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

不是吗

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

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

record_is_deleted_bt = 0

?

cfqueryparam除了养成使用它的习惯之外,在这种情况下使用它有什么好处吗?有缺点吗?

4

1 回答 1

4

不,这并不过分。cfqueryparam 的第一项工作是数据绑定。它有助于防止 sql 注入只是附加奖励。通过数据绑定准备好的语句执行得更快。你错误地认为它只是用来帮助防止 sql 攻击。
重要提示: 我在 Oracle 数据库上添加了 @Dan Bracuk 提供的测试用例。

<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 毫秒。without total 总是至少是 with total 的两倍。

于 2014-10-01T13:22:48.503 回答