回答你标题中的问题:不,这不是CFScript中的错误。你展示的内容根本与CFScript无关。
然而,回答你实际想问的问题:是的,你发现了Query.cfc中的一个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#">
请注意,我已经将过滤器值硬编码到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]对象或列名称缺失或为空。对于SELECT INTO语句,请验证每个列都有名称。对于其他语句,
查找空别名。别名定义为“”或[]是不允许的。将别名更改为有效名称。
FYI: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上也是一样的。
但是同样地,如果我是你,我不会在那里放这些引号。除非有非常好的理由,在处理数据时不要加引号,而是在显示时再加。我猜它们是为了显示目的而放置的?
Query.cfc
中使用preserveSingleQuotes
有关,但我在针对 SQL Server 进行测试时得到了不同的结果(数据库语法错误)。因此,目前尚不清楚这是否是一个 bug,或者如果是 bug 的话,它是否严格属于 CF 的 bug。不确定您为什么需要这样做,但作为解决方法,您可以在演示层中使用 CF 代码(更典型的方法)添加它,或者可能使用数据库的字符串函数来生成单引号。例如,在 SQL Server 中:SELECT char(39) + email + char(39) AS Email ...
- Leigh