在构buildstring中的数据库查询时,ColdFusion会添加额外的引号

我在ColdFusion编码,但试图留在cfscript,所以我有一个函数,允许我通过查询运行它与<cfquery blah > #query# </cfquery>

不知何故,当我用sql = "SELECT * FROM a WHERE b='#c#'"构build查询并将其传入时,ColdFusion用2个单引号replace了单引号。 所以它在最后的查询中变成WHERE b=''c''

我已经尝试了很多不同的方式来创buildstring,但我不能让它只留下一个报价。 即使做一个stringreplace也没有效果。

任何想法为什么发生这种情况? 在这个项目期间,破坏我在cfscript中生活的希望

根据devise,ColdFusion在<cfquery>标签内插入variables时会转义单引号。

要做你想做的,你需要使用PreserveSingleQuotes()函数。

 <cfquery ...>#PreserveSingleQuotes(query)#</cfquery> 

然而,这并没有解决你正在暴露自己的SQL注入的危险。

使用<cfqueryparam>还允许数据库caching查询,这在大多数情况下会提高性能。

阅读Ben Fort Forta的一篇文章和Brad Wood最近发表的一篇文章 ,可能会有所帮助,详细了解使用<cfqueryparam>的好处。

正如其他人所说,你的问题的答案是使用preserveSingleQuotes(...)

但是,您真正需要的解决scheme 不是以这种方式dynamic构build您的查询。 坏坏坏。

把你的SQL放到cfquery标签里面,根据需要用ifs / switches / etc,确保所有的 CFvariables都使用cfqueryparam标签。

(注意,如果在ORDER BY子句中使用variables,则需要手动转义任何variables; cfqueryparam不能在ORDER BY子句中使用)

使用以下语法时,ColdFusion会自动转义<cfquery>标记中的单引号引号:

 SELECT * FROM TABLE WHERE Foo='#Foo#' 

如果你想保留#Foo#单引号,你必须调用#PreserveSingleQuotes(Foo)#

请注意,自动转义工作仅适用于variables值,不适用于函数结果。

 SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */ 

有鉴于此,函数PreserveSingleQuotes() (请参阅Adobe LiveDocs )不过是对值的“空操作” – 将其转换为函数结果以绕过自动转义。

因为我认为他做得很好,所以我把Dave的答案投给了他。

不过,我想补充一点,也有几种为ColdFusiondevise的工具,可以简化很多您可能执行的常见SQL任务。 史蒂夫·布莱恩特(Steve Bryant)写的DataMgr非常轻量级的工具,以及由Doug Hughes最初创build的反应器 Mark Mandel的转移工具,以及我开发的名为DataFaucet的工具 。 这些都有自己的长处和短处。 就我个人而言,我认为你可以考虑DataFaucet是一个能够让你留在cfscript中的最好的能力,用各种语法来构build不同types的查询。

这里有几个例子:

 qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8) qry = datasource.select("avg(price) as avgprice","products"); qry = datasource.getSelect("avg(price) as avgprice","products").filter("categoryid",url.categoryid).execute(); qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute(); 

该框架确保cfqueryparam始终与这些filter语句一起使用,以防止sql注入攻击,并且插入,更新和删除语句也有类似的语法。 (有几个简单的规则来避免sql注入 。)