Ошибка SQL с новым запросом() в скрипте ColdFusion / Railo

Я получаю очень бесполезную ошибку SQL от Railo при попытке сделать вставку. Я думаю, что это как-то связано со значениями :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.

Вот ошибка Рейло:

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! И, как упоминалось ранее... кажется, что SQL работает, когда я заменяю эти значения :param.

Есть ли что-то, что я делаю неправильно здесь? Выдергиваю мне волосы!

Спасибо, Майкл.

РЕДАКТИРОВАТЬ:

Забыл упомянуть, версия Railo:

Railo 3.3.1.000 Error (database)

person Michael Giovanni Pumo    schedule 15.02.2012    source источник


Ответы (3)


Похоже, вы столкнулись с проблемой RAILO-1281, которая должна быть исправлена ​​в версии 3.3. .1.005.

«RAILO-1281: при выполнении запроса INSERT с помощью CFScript «новый запрос()» и использовании cfqueryparam с addParam() конец «)» удаляется»

Кроме того, вы должны использовать addParam для всех динамических значений.

person Leigh    schedule 15.02.2012
comment
Хорошо спасибо. Сейчас я вернулся к использованию CFC на основе тегов. Я пытался использовать cfscript, но я обнаружил, что это еще не все. Ну что ж! Спасибо за информацию. - person Michael Giovanni Pumo; 15.02.2012
comment
Кстати, помимо обновления в комментариях упоминается исправление, которое вы можете довольно легко применить вручную к вашему файлу query.cfc. Но это зависит от вас. - person Leigh; 15.02.2012

Попробуй это

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")); 
person Peruz Carlsen    schedule 15.02.2012
comment
Кажется, это ничего не решает, но вместо этого создает другую ошибку: параметр 2 функции right теперь должен быть положительным числом [0]. Я также пытался вручную удалить интервал; неудачно. - person Michael Giovanni Pumo; 15.02.2012

Не уверен, что это ваша проблема, но рекомендуется использовать addParam для всех ваших переменных, а не только для рисков SQL Injection.

Это гарантирует, что они передаются правильно с правильным форматированием, а также обеспечивает хорошую привычку. Может быть, я ошибаюсь, но разве #createODBCDateTime# не нужно заключать в одинарные кавычки для mySql? addParam сделает это за вас.

person Jonathan Rowny    schedule 15.02.2012
comment
Я не думаю, что это вызывает проблему, так как запрос работал, когда я просто удалил все значения :param. Дата входит в тип столбца даты/времени, поэтому это не varchar и, таким образом, освобождается от необходимости заключать его в кавычки, я думаю. - person Michael Giovanni Pumo; 15.02.2012
comment
@MichaelGiovanniPumo См. этот пост: stackoverflow .com/questions/8551940/ синтаксическая ошибка, вызванная НЕ использованием одинарных кавычек. Также смотрите официальную документацию. dev.mysql.com/doc/refman/ 5.1/en/date-and-time-literals.html И еще одна ссылка на требование одинарных кавычек: stackoverflow.com/questions/5452124/ - person Jonathan Rowny; 15.02.2012
comment
@Jonathan - это относится к дате strings. createODBCDate возвращает объект даты и времени, который обрабатывается по-другому. Объекты даты и времени не обязательно заключать в одинарные кавычки (на самом деле их добавление вызывает синтаксическую ошибку). - person Leigh; 15.02.2012
comment
@Leigh Ооо, я забыл, что вернул объект. Мой CF ржавый. - person Jonathan Rowny; 15.02.2012