SQL查询的ColdFusion单引号问题

时间:2015-11-06 21:22:13

标签: sql-server coldfusion coldfusion-11 cfquery single-quotes

在我的ColdFusion 11应用程序中,使用SQL Server 2008-R2,我在CF组件中遵循cfquery标记:

<cfquery name="result_set" dataSource="#request.dsn_name#">
    select name, state from myTable #REReplace(where_clause,"''","'","ALL")#        
</cfquery>

此处where_clause是一个变量。 CF将两个单引号替换为单引号,因此我使用REReplace函数将两个单引号替换为一个。所以我的查询更改,例如来自

select name, state from myTable WHERE name IN (''ABC'') 

到此:

 select name, state from myTable WHERE name IN ('ABC') 

问题是名称列值包含单引号时。例如。

select name, state from myTable WHERE name IN ('Smith's bat') 

在这种情况下,查询失败。我该如何解决此类案件。我尝试了PreserveSingleQuotes,但它的问题是列的值为单引号。

更新

此应用程序是由使用ColdFusion MX 7的人多年前开发的。原作者根据特定条件为where_clause变量创建动态字符串。这是一个很长的cfs文件,其中有几个条件用于为where_clause创建动态字符串。因此,使用cfqueryparam可能不合适,或者可能需要对客户不允许的代码进行彻底检查。

2 个答案:

答案 0 :(得分:1)

这是一个令人讨厌的问题。我担心我只能提出一个讨厌的“解决方案”。

  • 替换值分隔符:<cfset where_clause = replace(where_clause, "''", "§§", "ALL")>
  • 然后转义实际的单引号:<cfset where_clause = replace(where_clause, "'", "\'", "ALL")>
  • 现在还原替换并规范化分隔符:<cfset where_clause = replace(where_clause, "§§", "'", "ALL")>

把它扔在一起:

<cfset substitution = "§§"> <!--- use whatever char sequence works best for your data --->

<!--- fallback in case the substitution is part of your data --->
<cfif where_clause contains substitution>

    <cfset substitution = "°°°">
    <!---
        you can basically start looping through a bunch of alternatives
        or even expand the substition with an additional character
        ...you get the idea
    --->

</cfif>

<cfset where_clause = replace(where_clause, "''", substitution, "ALL")>
<cfset where_clause = replace(where_clause, "'", "\'", "ALL")>
<cfset where_clause = replace(where_clause, substitution, "'", "ALL")>

<cfquery...

正如您所看到的,这仍然存在很大问题,并且有一天可能会失败。但只要你必须处理where_clause变量,就没有更好的选择。

答案 1 :(得分:0)

您需要以这种方式使用Function PreserveSingleQuotes:

<cfquery name="result_set" dataSource="#request.dsn_name#">
    select name, state from myTable #PreserveSingleQuotes(REReplace(where_clause,"''","'","ALL"))#        
</cfquery>

祝你有个美好的一天!