将cfqueryparam与常量一起使用

Fis*_*Ice 5 coldfusion cfqueryparam

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

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

是不是

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">
Run Code Online (Sandbox Code Playgroud)

矫枉过正?我的意思是,没有机会进行SQL注入,我不认为在这里使用绑定变量可以提高数据库性能.这样做是否合情合理

record_is_deleted_bt = 0
Run Code Online (Sandbox Code Playgroud)

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

CFM*_*per 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#.">
Run Code Online (Sandbox Code Playgroud)

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

  • 好奇的。您是在测试通过 ColdFusion 执行查询的整个时间,还是使用 SQL Profiler 或其他工具来测试查询本身的运行速度?这才是真正的问题吧?当然,使用 cfqueryparam 时 ColdFusion 的执行速度会慢一些,因为执行该标记时会产生开销。真正的问题应该是,数据库级别的实际查询是更快还是更慢? (3认同)
  • 请随意证明使用查询参数而不是常量将提高性能的说法。 (2认同)