在我的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可能不合适,或者可能需要对客户不允许的代码进行彻底检查。
答案 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>
祝你有个美好的一天!