3

这是返回用户表中单引号包围的电子邮件的有效查询。

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 并且不让我将单引号添加到输出中。

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

4

2 回答 2

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 传递给数据库的 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#">

所以如果我是你,我会为此提出一个错误。注:CF9.0.2 和 CF10.0.7 相同

但是,同样......如果我是你,无论如何我都不会把那些引号放在那里。除非有很好的理由,否则请在显示时将它们插入,而不是在进行数据处理时插入。我想它们是为了展示目的吗?

于 2013-01-19T18:35:38.820 回答
0

对于它的价值,我只是被这个问题所吸引。似乎有效的是对您的 Query.cfc 对象 (/[YOUR-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 文件,重命名它并将其用作自定义标记,仅当我们需要运行我们怀疑可能使用额外撇号的查询时。唯一的区别将是这一点小变化。

于 2014-07-15T19:01:58.067 回答