Coldfusion: работа с нулевыми значениями в поле даты

У меня есть эта форма со всеми видами сертификатов сотрудников, мне нужно ввести дату. Иногда эта дата будет месяцами в будущем, в других случаях дата будет неопределенной, нулевой.

Всякий раз, когда я пытаюсь передать нулевое значение в свой CFC, я всегда получаю сообщение об ошибке, похожее на:

Аргумент CPRADULTEXP, переданный функции addEmployee, не имеет типа date.

Код моей формы:

<!--- If null, set a default if not, set the default to database default --->
<cfif not isDefined("certificationsList.cprAdultExp")>
<cfinput type="datefield" required="no" name="cprAdultExp" value="" >
<cfelse>
<cfinput type="datefield" required="no" name="cprAdultExp" value="#dateformat(certificationsList.cprAdultExp, "mm/dd/yyyy")#" >
</cfif>

Процессор форм:

<!--- Is the date defined? --->
<cfif len(Trim("form.cprAdultExp"))  EQ 0>
<cfinvokeargument name="cprAdultExp" value="#CreateODBCDate(Form.cprAdultExp)#">
<cfelse>
<cfinvokeargument name="cprAdultExp" value="">
</cfif>    

Прямо сейчас он передает это нулевое значение, база данных настроена на обработку/прием нулевых значений.

Как я могу исправить?


person Snow_Mac    schedule 04.01.2011    source источник
comment
Пустая строка не является допустимой датой. Сделайте аргумент cffunction необязательным и ничего не передавайте, если form.cprAdultExp не является датой.   -  person Leigh    schedule 05.01.2011
comment
Ошибка выдается CF (когда вы перемещаете ее в функции) или SQL (во время вставки, после того, как она была обработана функцией)?   -  person n_kips    schedule 10.01.2011


Ответы (1)


Вы упускаете самую важную часть - фактический CFC и запрос, который выполняет вставку. Что происходит, так это то, что ваш тег <cfargument> вводится как «дата», поэтому, когда вы передаете пустую строку, проверка не выполняется. (Это одна из причин, по которой я не печатаю свои аргументы).

Вам нужно либо отключить проверку типов, либо изменить тип аргумента на «строка» или «любой». Теперь, когда вы это сделаете, вам также нужно изменить свой тег <cfqueryparam> (вы используете <cfqueryparam>, не так ли?!) на что-то вроде этого:

<cfqueryparam .... null="#not len(trim(arguments.thedate))#" />

Это исправит тебя...

person Todd Sharp    schedule 04.01.2011
comment
Хороший ответ, хотя я бы, вероятно, сделал свое утверждение чем-то вроде «null=#not isValid(date,arguments.theDate)#». Таким образом, вы проверяете актуальность, а не просто отсутствие пустоты. Это делает CFC более полезным в самых разных ситуациях. - person Kyle Humfeld; 05.01.2011
comment
Это не сработает, если ‹cfargument› по-прежнему набирается как «дата». Исключение все равно будет выдано, если ему будет передана пустая строка. - person Todd Sharp; 05.01.2011
comment
Я использую cfargument, но не использую cfqueryparam, зачем мне/нужно использовать cfqueryparam? - person Snow_Mac; 05.01.2011
comment
Во-первых, это поможет предотвратить атаки SQL-инъекций, которые потенциально могут стать серьезной проблемой безопасности. Они также в конечном итоге обеспечат лучшую производительность за счет использования связанных параметров. Я настоятельно рекомендую вам больше узнать о ‹cfqueryparam› и немедленно начать его использовать. Это должно помочь вам начать: bit.ly/g3fWH6 - person Todd Sharp; 05.01.2011