这是cfscript中的ColdFusion Bug吗?

时间:2013-01-18 22:34:51

标签: coldfusion coldfusion-9 coldfusion-10

这是一个有效的查询,用于返回来自users表中单引号的电子邮件。

SELECT  '''' +email + '''' as email
FROM    users
where fname = @fname

然而,当我尝试在这样的cfscript(cf9)查询中执行此操作时:

var q = new Query(datasource="warewithal");
q.setSQL("SELECT  '''' +email + '''' as email
                FROM users where firstName= :firstName ");
q.addParam(name="firstName", value=trim(firstName), cfsqltype="cf_sql_varchar");

我最终得到的是

Email
+email+

当我预期时(并通过在分析器中运行查询)

Email
'bozo@clowns.com'

cfscript正在执行一个perserveSingleQuote并且不允许我将单引号添加到输出中。

这是一个错误还是我做错了什么?

2 个答案:

答案 0 :(得分:5)

回答标题中的问题:不,这不是CFScript中的错误。你所展示的内容与CFScript完全无关。

但是要回答你意味着要问的问题:是的,你在Query.cfc中发现了一个错误。

以下是一些演示该错误的代码(并演示它与CFScript无关,以及与Query.cfc有关的一切)。

此代码可以正常工作:

<cfset query = new Query(datasource="scratch_mssql")>
<cfset query.setSql("
    SELECT  '''' + email + '''' as email
    FROM    users
    WHERE   firstName = '#firstName#'   
")>
<cfset emailAddresses = query.execute().getResult()> 
<cfdump var="#emailAddresses#">

请注意,我已将过滤器值硬编码到SQL字符串中。呸。

此代码错误:

<cfset query = new Query(datasource="scratch_mssql")>
<cfset query.setSql("
    SELECT  '''' + email + '''' as email
    FROM    users
    WHERE   firstName = :firstname  
")>
<cfset query.addParam(name="firstname", value=firstName, cfsqltype="CF_SQL_VARCHAR")>
<cfset emailAddresses = query.execute().getResult()> 
<cfdump var="#emailAddresses#">

我的错误是:

[Macromedia][SQLServer JDBC Driver][SQLServer]An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.

仅供参考:CF传递给DB的SQL是:

SELECT  '' '' + email + '' '' as email FROM users WHERE firstName = (param 1)

为了证明它是由ColdFusion错误处理您的单引号引起的,这可行:

<cfset query = new Query(datasource="scratch_mssql")>
<cfset query.setSql("
    SELECT  email as email
    FROM    users
    WHERE   firstName = :firstname  
")>
<cfset query.addParam(name="firstname", value=firstName, cfsqltype="CF_SQL_VARCHAR")>
<cfset emailAddresses = query.execute().getResult()> 
<cfdump var="#emailAddresses#">

如果我是你,我会为此提出bug。注意:在CF9.0.2和CF10.0.7上它是相同的

但是,同样......如果我是你,我无论如何也不会把那些引号放在那里。除非有一个很好的理由,否则当你进行显示时,不要在进行数据处理时将它们粘在上面。我认为他们是出于展示目的?

答案 1 :(得分:0)

对于它的价值,我对这个问题感到满意。看起来有用的是对Query.cfc对象的简单修复(/ [YY-CF-INSTALL] / CustomTags/com/adobe/coldfusion/Query.cfc)。在replaceDelimsWithMarkers()函数中,更新此行(对我来说是LN 341)

newSql = newSql & SINGLEQUOTE & sqlArray[i] & SINGLEQUOTE & " ";

通过删除末尾的引用空格,所以它是:

newSql = newSql & SINGLEQUOTE & sqlArray[i] & SINGLEQUOTE & "";

然后它很棒。我正在查找用户,并且需要找到姓氏为“O'Neill”的用户。无论我做了什么,我都会得到“O''Neill”,当你声明失败时。

你能想到这种变化/修复会产生负面影响的任何情况吗?我不能脱离我的头脑,但是现在我们要复制query.cfc文件,重命名它并将其用作自定义标记,只有当我们需要运行查询时我们怀疑可能会使用额外的撇号。唯一的区别就是这一点变化。