【问题标题】:Unexpected results from CFQUERY and CFIF comparisonCFQUERY 和 CFIF 比较的意外结果
【发布时间】:2016-11-09 11:36:46
【问题描述】:

这段代码正在生产中,用于根据使用情况阻止 IP。触发了一封电子邮件,并执行了一个插入,其 IP 地址满足 cfif 条件。但是,当我在 SQL 编辑器中执行查询时,对于相同的 IP,它返回的计数为 0(即 getNin​​eHundredCnt.maxDownload)。

这仅发生在一位用户身上。它对其他用户来说运行良好,每天有近 1L 用户访问该应用程序。谁能帮忙解释一下为什么会这样?

<cfquery name="getExcessiveUsageConfig" DATASOURCE="#arguments.datasrc#">
    SELECT * FROM ExcessiveUsageConfig
</cfquery>

<cfset usageLimitStruct.maxFifMinDownload = getExcessiveUsageConfig.MAXFIFMINDOWNLOAD >

<!---- This value is 900 and not changed --->
<cfquery name="getNineHundredCnt" DATASOURCE="#arguments.datasrc#">
   SELECT 
         ( select count(9)  
           from   downloads 
           where  download_time > dateadd(minute,-15,getdate()) 
           and    USER_IP = <cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR">
        ) as maxDownload,
        ( select TOP 1 DATEDIFF(second, DOWNLOAD_TIME, GETDATE())  
          from   CAPTCHA 
          WHERE  USER_IP = <cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR"> 
          and    Erights_sessionId = <cfqueryparam value="#arguments.erightsCookie#" cfsqltype="CF_SQL_VARCHAR">
          order by DOWNLOAD_TIME DESC
        ) as Ccheck 
</cfquery>


<cfif getNineHundredCnt.maxDownload gte usageLimitStruct.maxFifMinDownload>

   <cfquery name="checkToBlockIpExcessUsage" DATASOURCE="#arguments.dataAuthentication#">
      INSERT INTO DisabledIPs(IP,TIMEDISABLED)
      VALUES (<cfqueryparam value="#remoteAddress#" cfsqltype="CF_SQL_VARCHAR">,GETDATE())
   </cfquery>

     <cfmail from="xxx@xxx.com" to="xxx@xxx.com" subject="IP Blocked"  type="text">
     IP : #remoteAddress#
     Time : #currentTime#
     The IP has been blacklisted 
     </cfmail>

</cfif>

【问题讨论】:

  • 如果查询超时,是否有机会从 sql 查询中返回 0 作为值?
  • ExcessiveUsageConfig 中有多少行?
  • 只有一行,MAXFIFMINDOWNLOAD列的值为900
  • 将变量添加到电子邮件中,以便在再次发生时可以跟踪它们。 当我在 sql 编辑器中执行查询时 在同一时间段内?如果稍后执行,结果可能会有所不同。 (顺便说一句,这个问题被标记为三个引擎。具体来说,您使用的是哪一个?)
  • @nikhilreddy - 这段代码是否可能包含在 cffunction 中,而您忘记了 var/local 范围内的所有变量?如果是这样,它可能会导致竞争条件和您描述的场景。解决办法是var/local作用域all的函数局部变量,包括查询名称。

标签: coldfusion railo lucee


【解决方案1】:

一种可能性是 getNin​​eHundredCnt.maxDownload 为 0,usageLimitStruct.maxFifMinDownload 也为 0。输出值并验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多