Переданное значение рассматривается как пустое в CFQUERYPARAM

Это меня сильно сбивает с толку, так как я делал это сотни раз, но теперь это меня не устраивает.

Я выполняю базовое обновление запроса с использованием параметров CF, и первичный ключ для таблицы передает пустое значение, что приводит к критическому сбою.

Даже если я ввожу жестко запрограммированное число в #form.id placeholder#, я получаю следующее:

Invalid data '' for CFSQLTYPE CF_SQL_NUMERIC.

Вот моя кодовая база

<cfquery name="updateIdea" datasource="#request.db#">
            UPDATE freshideas
            SET subject = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.subject#" null="no" />,
                content = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.content_text#" />,
                postmonth = <cfqueryparam cfsqltype="cf_sql_numeric" value="#form.postmonth#" />,
                postyear = <cfqueryparam cfsqltype="cf_sql_numeric" value="#form.postyear#" />,
                imglink = <cfqueryparam cfsqltype="cf_sql_varchar" value="#image#" />,
                oindex = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.oindex#" null="no" maxlength="3" />
            WHERE id = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.id#" null="no" />
        </cfquery>

Вставка работает нормально, а идентификатор столбца - auto_increment int(5).


person justacoder    schedule 31.03.2012    source источник
comment
Тип идентификатора cf_sql_integer. Поэтому, если в сообщении об ошибке указано cf_sql_numeric, это указывает на проблему в одном из других полей, например form.postmonth или form.postyear.   -  person Leigh    schedule 31.03.2012
comment
Теги cfqueryparam для INSERT такие же, как и оператор update, и с этим проблем нет.   -  person justacoder    schedule 31.03.2012
comment
Я предлагаю избавиться от имени вашего запроса. Кроме того, избавьтесь от null=no. Попробуй это. Я буду работать утром и могу помочь вам решить эту проблему.   -  person Evik James    schedule 31.03.2012
comment
Re: Теги cfqueryparam одинаковы Да, но данные, вероятно, разные. Ошибка предполагает, что проблема связана с вводом, а не с тегами. В частности, одно из значений numeric. Можете ли вы сделать дамп области FORM и опубликовать фактические значения при возникновении ошибки?   -  person Leigh    schedule 31.03.2012
comment
я бы порекомендовал удалить все теги cfquery и cfqueryparam и просто выгрузить оператор SQL с выведенными значениями формы. Это скажет вам, где именно ошибка. Как уже говорили другие, столбец postmonth или postyear, по-видимому, является проблемой.   -  person Matt Busche    schedule 31.03.2012
comment
Просто выгрузите переменные перед запросом и посмотрите, действительно ли они такие, как вы думаете.   -  person baynezy    schedule 31.03.2012
comment
Лично я не полагаюсь на queuryparam для проверки. Бегство -- да. Но вы по-прежнему хотите проверять значения формы и отображать значимые ошибки для пользователя. Поэтому, если вы используете StructKeyExists(form, "xyz") AND isNumeric(form.xyz), это также гарантирует, что вы не будете передавать пустую строку в cf_sql_numeric, что, скорее всего, имеет место здесь.   -  person Sergey Galashyn    schedule 31.03.2012
comment
Я избавился от проверки null = no и, похоже, снова работает. CFDUMP показал мне все значения, которые я ожидал, поэтому при передаче ничего не было нулевым или неверным. Я запишу это на а?   -  person justacoder    schedule 31.03.2012
comment
@AngrySpartan null="no" не является проверкой. Это переключатель, который решает, передается ли значение NULL в БД. Обычно здесь есть логическое выражение, например null="#Trim(FORM.foo) eq ''#", которое устанавливает параметр в NULL, когда значение формы пусто. Только не используйте его со значениями yes или no, так как в этом нет никакого смысла.   -  person Tomalak    schedule 31.03.2012
comment
@AngrySpartan - Что-то не сходится... Вы уверены, что разместили правильный код? Потому что сообщение об ошибке кажется довольно ясным: в один из столбцов cf_sql_numeric вместо числа была передана пустая строка. Поскольку null="no" в любом случае используется по умолчанию (и он даже не используется в ваших числовых столбцах), его присутствие не должно иметь никакого эффекта так или иначе.   -  person Leigh    schedule 01.04.2012
comment
Проблема заключалась в моем неправильном внимании к деталям. Переменная postmonth не передавалась с непустым значением. Спасибо всем за помощь.   -  person justacoder    schedule 01.04.2012
comment
А, значит, моя первая догадка была верной :P   -  person Leigh    schedule 02.04.2012


Ответы (2)


Это долгий путь, но если вы недавно внесли изменения в свою таблицу, у вас могут возникнуть проблемы с кэшированием схемы. Попробуйте перезапустить сервер CF или просто добавьте пробелы в свой запрос. Вот пост с дополнительной информацией.

http://www.coldfusionmuse.com/index.cfm/2005/4/29/dbschemaChange

person Mark A Kruger    schedule 31.03.2012
comment
Спасибо за статью, но я использую MySQL, а не MSSQL. - person justacoder; 31.03.2012

Я получаю это много в моей текущей кодовой базе. При добавлении cfqueryparams разработчик предполагал значения, а иногда ожидаемое целое число представляло собой пустую строку.

Если подходит пустая строка/нуль, используйте этот http://www.carehart.org/blog/client/index.cfm/2007/3/5/cfqueryparam_null

В моем случае целое число должно было быть целым числом, поэтому обычно проблема заключается в том, как эта переменная устанавливается, как запрос, возвращающий 0 записей.

person Mike Henke    schedule 31.03.2012