在我的ColdFusion 11的应用程序,使用SQL Server 2008 R2,我下面一个CF组件内CFQUERY标签:ColdFusion的单引号问题与SQL查询
<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,但它具有相同的问题,其中列的值使用单引号。
UPDATE
这个程序使用的ColdFusion MX 7原作者是创建基于某些条件where_clause变量动态字符串开发年前由一个人。这是一个很长的cfs文件,有几个条件用于为where_clause创建动态字符串。因此,使用cfqueryparam可能不合适,或者可能需要彻底检查客户不允许的代码。
更好的方法是重写查询以使用参数('')。这样做会非常容易出错,并可能导致[** SQL注入**](https://www.owasp.org/index.php/SQL_Injection)漏洞。 –
...并且是您首先遇到查询问题的原因。不要使用那种动态sql。相反,在cfquery中构建sql并在所有参数上使用cfqueryparam(或者查看使用cfscript查询,这为“参数化”sql提供了更多的灵活性)。这既能保护数据库,又能消除这种类型的错误。 – Leigh
如果你想坚持在''调用之外创建你的SQL字符串,可以使用'queryExecute()'来代替它,它允许你将参数占位符放入SQL字符串中;然后将参数值传递给单独的数组/结构。只是*不要*将值硬编码到SQL字符串中。这是可怕的,尴尬的,危险的。 –