【问题标题】:cfsavecontent display double apostrophe in SQL statementcfsavecontent 在 SQL 语句中显示双撇号
【发布时间】:2019-09-19 13:19:33
【问题描述】:

我的 SQL 语句中有多个 OR,因此我想将其中的一小部分保存在 cfsavecontent 中。这是那部分:

<cfsavecontent variable="checkDepartment">
    <cfif #wrkDept# EQ #dept[2][1]#>
        Department = 'Health' AND
    <cfelse>
    Department = '#wrkDept#' AND
    </cfif>
</cfsavecontent>

但我在页面上看到的错误显示了健康一词周围的 2 组撇号。

SQL   
 SELECT COUNT(*) AS numItems
 FROM   IT_PROJECTS
 WHERE 
 Department = ''Health'' AND
 status = 'Cancelled'

谁能帮我只得到一个撇号?谢谢

【问题讨论】:

  • 这是一个常见问题。简短的回答,CF 故意这样做是为了防止sql injection 的常见形式。尽管您可以使用 PreserveSingleQuotes 来避免它 - 不要 - 这是一个 sql 注入风险。对于现代版本,最好的选择是使用查询参数。详细了解queryExecute and query parameters
  • @MichaelDeDonato 您总是不得不担心注射。有意和无意的内部威胁是您最大的安全威胁。一次意外的注射仍然会毁了你的一天。此外,cfqueryparam 还有其他好处。
  • @Michael - 暂时忽略动态语法 - 为什么同一字段需要单独的 cfif?如果变量包含“健康”等值...只需在 sql 中使用它,即WHERE ColumnName = &lt;cfqueryparam value="#theVariableName#" cfsqltype="..."&gt;
  • ...为什么 #wrkDept# eq #dept[2][1]# 有特殊例外?您能否详细说明“每个都作为有关部门的 cfif 的意思。,因为可能有更好的方法来编写 sql。

标签: sql coldfusion where-clause


【解决方案1】:

所以这个答案似乎比实际要复杂得多。在不知道您的查询具体是什么样子的情况下(回复:OR 条件),我不确定如何构建它。它可以更好。目标应该是使用对您尝试获取的数据最有意义的查询单次访问您的 SQL 服务器。我不确定你想用cfsavecontent 做什么,但我认为你不需要它。

我的示例查询 (https://trycf.com/gist/4e1f46bfa84a6748aced0f9ee8221c6d/acf2016?theme=monokai) 的大部分已设置。我选择使用 cfscript 格式,因为正如 Redtopia 所说,我还发现在 cfscript 中构建动态查询要容易得多。

在初始设置之后,我基本上只是编写了我将在最终queryExecute() 中使用的变量。

// Base query.
qry = "SELECT count(*) AS theCount FROM IT_PROJECTS WHERE 1=1 " ;
// This is our dynamic filter that we build below.
qfilter = {} ;
// Query options. 
opts =  { "dbtype":"query" } ;

在我们有了基础之后,我构建了查询的动态部分。根据您当前的需求和设置,这部分可能会发生很大变化。

对于第一部分,我基本上用三元评估替换了您的cfif。我不确定您的数据如何影响dept 的评估或该数组的来源。但是从那里我构建了一个基本的包含查询语句并为其设置了查询参数值。然后我添加第二个检查,它将为查询选择一组不同的值(当前基于偶数/奇数秒)。同样,我不确定您在这里查询的意图,所以我只是做了一些动态的。

  //////////// BUILD DYNAMIC FILTER ////////////

  qdept = ( wrkDept == dept[2][1] ) ? 'Health' : wrkDept ;
  /// This one is an included filter:
  qry &= " AND department = :dpt AND status = :sts " ;
  qfilter.dpt = {"value":qdept,"cfsqltype":"CFSQLVARCHAR"} ;
  qfilter.sts = {"value":"Cancelled","cfsqltype":"CFSQLVARCHAR"} ;

  /// Adding Dynamic ORs

  // Dynamically set status based on even/odd seconds.
  qStatus = ( now().second()%2==0) ? "Cancelled" : "Active" ;
  qry &= " OR ( department = :dpt2 AND status = :sts2 ) " ;
  qfilter.dpt2 = {value:"IT",cfsqltype:"CFSQLVARCHAR"} ;
  qfilter.sts2 = {value:qStatus,cfsqltype:"CFSQLVARCHAR"} ;

这给了我们一个如下所示的 SQL 字符串:

SELECT count(*) AS theCount 
FROM IT_PROJECTS 
WHERE 1=1 
    AND department = :dpt AND status = :sts 
    OR 
    ( department = :dpt2 AND status = :sts2 ) 

使用 SQL 语句,ANDOR 条件的放置会极大地影响结果。使用括号对您需要的条件进行分组。

在我们构建了查询字符串之后,我们只需要将它和我们的查询参数插入到queryExecute()

  result = queryExecute( qry , qfilter , opts ) ;

如果我们想输出我们的数据,我们可以去:

  writeOutput("There are " & result.theCount & " records." ) ;

这给了我们:

There are 8 records.

同样,我不知道您的主要条件是什么样的。如果您可以给我一个包含ORs 和ANDs 的查询示例,我会尝试为您修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多