3

これは、一重引用符で囲まれた電子メールを 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 を実行しており、出力に一重引用符を追加できません。

これはバグですか、それとも何が間違っていますか?

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 が 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#">

だから、私があなただったら、これについてバグを提起します。注: CF9.0.2 と CF10.0.7 で同じです。

しかし、同じように... もし私があなただったら、とにかくそこにそれらの引用符を入れません. よほどの理由がない限り、データ処理を行っているときではなく、表示を行っているときに挿入してください。私はそれらが表示目的のためにそこにあると思いますか?

于 2013-01-19T18:35:38.820 に答える