使用cfscript查询的查询参数时出错

Jas*_*son 9 coldfusion

这是我的代码:

var qryStr = "
            UPDATE templates_email 
            SET title = :title, test_emails = :testEmail, body = :body
            WHERE id = :templateID";

q = New Query();
q.setSQL(qryStr);
q.addParam(name="title", value="#arguments.title#", cfsqltype="cf_sql_char");
q.addParam(name="body", value="#arguments.templateContent#", cfsqltype="cf_sql_char");
q.addParam(name="testEmail", value="#arguments.test_emails#", cfsqltype="cf_sql_char");
q.addParam(name="templateID", value="#arguments.id#", cfsqltype="cf_sql_integer");

return q.execute().getResult();
Run Code Online (Sandbox Code Playgroud)

这是错误:

在指定的参数列表中找不到参数'body WHERE'

SQL:UPDATE templates_email SET title =:title,test_emails =:testEmail,body =:body WHERE id =:templateID

错误发生在C:\ ColdFusion9\CustomTags\com\adobe\coldfusion\query.cfc:第108行

我只能假设我使用参数构建SQL的方式有问题,但无法解决它的问题.谁能看到我在这里做错了什么?

Mar*_*del 13

获取params的解析器不会在返回值上进行标记,仅在空格上(这实在很烦人).请尝试以下方法:

var qryStr = "
    UPDATE templates_email 
    SET title = ( :title ), test_emails = ( :testEmail ), body = ( :body )
    WHERE ( id = :templateID )
";
Run Code Online (Sandbox Code Playgroud)

()应删除与解析器不能够识别在其中的任何问题:PARAMS停止和启动.

  • 你的解释有点误导.问题是它没有在*空格*上标记,它在*空格*上标记.它认为制表符和换行符是参数名称的一部分.在param名称之后添加单个空格字符(甚至不使用parens)也将修复它.也就是说,paren更好,因为某人的编辑器可能会设置为在触摸文件时删除尾随空格. (4认同)

Per*_*sen 6

发生此错误是由于在SQL语句中找到了制表符和换行符。我通常在SQL语句的函数下面运行以删除这些字符。

string function cleanSQL(required string sqlStatement)
    output="false"
{
return trim(reReplace(arguments.sqlStatement, "\t|\n", " ", "all"));
}
Run Code Online (Sandbox Code Playgroud)

因此,您的setSQL()如下所示:

q.setSQL(cleanSQL(qryStr))
Run Code Online (Sandbox Code Playgroud)

或者简单地:

q.setSQL(reReplace(qryStr, "\t|\n", " ", "all"))
Run Code Online (Sandbox Code Playgroud)