【问题标题】:SQL error with "new query()" in ColdFusion / Railo scriptColdFusion / Railo 脚本中出现“new query()”的 SQL 错误
【发布时间】:2012-02-15 17:18:11
【问题描述】:

我在尝试插入时从 Railo 收到一个非常无用的 SQL 错误。我认为这与我传递给它的 :param 值有关;就像我把它们拿出来并用一个简单的字符串替换它们一样,它可以工作。

这是我的代码(位于 CFC 中):

local.registerUserQuery = new query();
            local.registerUserQuery.setDatasource("popwave");
            local.registerUserQuery.setSQL("

                INSERT INTO users (

                    userUUID,
                    userName,
                    userPassword,
                    userEmail,
                    userToken,
                    userCreated,
                    userBiography,
                    userCommentPoints,
                    userLinkPoints,
                    userImageID,
                    userRemoved,
                    userCategoriesOwner,
                    userCategoriesSubscribed

                )

                VALUES (

                    '#createUUID()#' , 
                    :userName , 
                    :userPassword , 
                    :userEmail , 
                    '#local.token#' , 
                    #createODBCDate(now())# , 
                    '' , 
                    0, 
                    0, 
                    0, 
                    0, 
                    0, 
                    0 

                )

            "); 

            local.registerUserQuery.setName("registerUser");

            local.registerUserQuery.addParam( name="userName", value="#arguments.userName#", cfsqltype="cf_sql_varchar" ); 
            local.registerUserQuery.addParam( name="userPassword", value="#arguments.userPassword#", cfsqltype="cf_sql_varchar" ); 
            local.registerUserQuery.addParam( name="userEmail", value="#arguments.userEmail#", cfsqltype="cf_sql_varchar" );

            local.registerUserQuery.execute();

我一生都无法理解为什么这会引发错误!我需要能够使用:param's。

这是 Railo 错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 49

检查该行号似乎没有指向任何相关内容。此查询位于第 200 行!而且,如前所述...当我替换这些 :param 值时,SQL 似乎可以工作。

实际上我在这里做错了什么吗?拔掉我的头发!

谢谢, 迈克尔。

编辑:

忘了说,Railo 版本是:

Railo 3.3.1.000 Error (database)

【问题讨论】:

    标签: mysql sql railo cfml


    【解决方案1】:

    听起来您遇到了问题RAILO-1281,应该在 3.3.1.005 中修复。

    “RAILO-1281:使用 CFScript “new query()” 执行查询 INSERT 并使用 cfqueryparam 加上 addParam(), 末尾的 ")" 被去掉"

    顺便说一句,您应该对所有动态值使用addParam

    【讨论】:

    • 好的,谢谢。我现在恢复使用基于标签的 CFC。我曾尝试使用 cfscript,但我发现它还不能满足它。那好吧!感谢您的信息。
    • 顺便说一句,除了升级 cmets 之外,还提到了一个修复程序,您可以很容易地手动应用到您的 query.cfc 文件。但这取决于你。
    【解决方案2】:

    试试这个

    local.registerUserQuery.setSQL(reReplace("
    
                INSERT INTO users (
    
                    userUUID,
                    userName,
                    userPassword,
                    userEmail,
                    userToken,
                    userCreated,
                    userBiography,
                    userCommentPoints,
                    userLinkPoints,
                    userImageID,
                    userRemoved,
                    userCategoriesOwner,
                    userCategoriesSubscribed
    
                )
    
                VALUES (
    
                    '#createUUID()#' , 
                    :userName , 
                    :userPassword , 
                    :userEmail , 
                    '#local.token#' , 
                    #createODBCDate(now())# , 
                    '' , 
                    0, 
                    0, 
                    0, 
                    0, 
                    0, 
                    0 
    
                )
    
            ", "\t|\n", " ", "all")); 
    

    【讨论】:

    • 这似乎并没有解决任何问题,反而产生了另一个错误:函数右的参数2现在必须是正数[0]。我也尝试过手动删除间距;没有运气。
    【解决方案3】:

    不确定这是否是您的问题,但最好将 addParam 用于所有变量,而不仅仅是 sql 注入风险。

    它确保它们以正确的格式正确传递,并强制养成一个好习惯。也许我错了,但#createODBCDateTime#不需要在mySql的单引号内吗? addParam 会为你做这些事情。

    【讨论】:

    • 我不认为这会导致问题,因为当我简单地删除所有 :param 值时,查询才有效。日期进入日期/时间列类型,因此它不是 varchar,因此我认为不需要在其周围加上引号。
    • @MichaelGiovanniPumo 看到这篇文章:stackoverflow.com/questions/8551940/… 不使用单引号导致的语法错误。另外,请参阅官方文档。 dev.mysql.com/doc/refman/5.1/en/date-and-time-literals.html 另一个需要单引号的参考:stackoverflow.com/questions/5452124/…
    • @Jonathan - 这与日期 字符串 有关。 createODBCDate 返回一个以不同方式处理的日期时间 object。 Datetime 对象不需要单引号(实际上添加它们会导致语法错误)。
    • @Leigh 哦,我忘了返回了一个对象。我的 CF 生锈了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2016-05-19
    • 2019-01-18
    相关资源
    最近更新 更多