这是cfscript中的ColdFusion错误吗?

这是cfscript中的ColdFusion错误吗?,coldfusion,coldfusion-9,coldfusion-10,Coldfusion,Coldfusion 9,Coldfusion 10,这是一个有效的查询,用于返回用户表中包含单引号的电子邮件 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 wh

这是一个有效的查询,用于返回用户表中包含单引号的电子邮件

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+
当我期望时(通过在分析器中运行查询获得)

cfscript正在执行perserveSingleQuote,不允许我将单引号添加到输出中


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

回答你标题中的问题:不,这不是CFScript中的bug。您演示的内容与CFScript完全无关

然而,要回答您想问的问题:是的,您在Query.cfc中发现了一个bug

下面的代码演示了这个bug(并演示了它与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#">
为了证明这是由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#">

所以如果我是你的话,我会为此提出诉讼。注:在CF9.0.2和CF10.0.7上相同


但是,同样。。。如果我是你,我无论如何也不会把那些话放在那里。除非有很好的理由,否则在进行显示时,不要在进行数据处理时插入。我想它们是为了展示而存在的吧?

不管它值多少钱,我只是被这个问题咬了一口而已。对Query.cfc对象(/[your-CF-INSTALL]/CustomTags/com/adobe/coldfusion/Query.cfc)的简单修复似乎有效。在replaceDelimWithMarkers()函数中,更新此行(对于我来说是LN 341)

通过删除结尾处的引用空格,因此:

newSql = newSql & SINGLEQUOTE & sqlArray[i] & SINGLEQUOTE & "";
然后它工作得很好。我在查找用户,需要找到一个姓“O'Neill”的用户。无论我做了什么,我都得到了“O”“Neill”,正如你所说的,这是失败的


您能想到这种更改/修复会产生负面影响的任何情况吗?我不知道该怎么办,但现在我们要复制query.cfc文件,重命名它,并将其用作自定义标记,仅当我们需要运行怀疑可能会使用额外撇号的查询时。唯一的区别是这一点小小的变化。

您是不是只用了两个单引号而不是四个单引号?3、5或6怎么样?您使用的是哪种数据库类型?(将其包含在查询相关问题的标记中总是很好的)。(编辑)虽然它肯定与
query.cfc
中的
preserveSingleQuotes
的使用有关,但我在针对SQL Server测试代码时得到了不同的结果(数据库语法错误)。因此,目前还不清楚它是否是一个bug,或者它是否是一个bug,也不清楚它是否严格意义上是一个CF bug。不确定为什么需要这样做,但作为一种解决方法,您可以使用CF代码(更典型)将其添加到表示层,也可以使用数据库的字符串函数来生成单引号。SQL Server中的ie:
选择char(39)+email+char(39)作为email…
我试图理解为什么需要将结果用单引号括起来。当您需要输出时,在电子邮件地址周围加上单引号可能会更容易,不是吗?您也可以尝试使用DBMS内置的concat函数,如SQL Server Adam中的concat(),示例中生成的SQL出错的原因是什么?我想知道这是否与你们在2010年弄乱的这篇帖子有关。lol.@Travis-Good find。我在调试它时发现了同样的东西。。只晚了几个小时;)CF10的
Query.cfc
似乎包含一个类似的
includeEmptyFields=true
fix。不幸的是,循环逻辑还在双引号之间添加了额外的空间。这就是我前面提到的sql server语法错误的原因。删除空格,它就可以正常工作。@Travis:我已经更新了文本以包含SQL。在CF9+10上都是一样的。只是一个观察:Railo4.0.2也有这个问题,使用这个代码。
SELECT  '' '' + email + '' '' as email FROM users WHERE firstName = (param 1)
<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#">
newSql = newSql & SINGLEQUOTE & sqlArray[i] & SINGLEQUOTE & " ";
newSql = newSql & SINGLEQUOTE & sqlArray[i] & SINGLEQUOTE & "";