Запрос на обновление не обновляет целочисленные поля с использованием CFQUERYPARAM - PullRequest
0 голосов
/ 07 апреля 2020

У меня простой запрос на обновление, задействована только одна таблица. Сначала я написал это без использования CFQUERYPARAM и продолжал получать ошибки, когда целочисленные поля (zip, plus 4, et c) были нулевыми. Итак, я переписал с использованием CFQUERYPARAM, чтобы нулевые значения не вызывали ошибок. Теперь, когда я что-то ввожу в целочисленные поля, данные не сохраняются.

Что мне не хватает?

Спасибо

DW

<cfquery name="updt_person" datasource="#application.datasource#">
  UPDATE tblperson 
  SET 
    firstname = '#form.firstname#', 
    lastname = '#form.lastname#', 
    address_line_1 = '#form.address_line_1#', 
    address_line_2 = '#form.address_line_2#', 
    city = '#form.city#', 
    stateid = #form.stateid#, 
    zip = <cfqueryparam value = "#form.zip#" cfsqltype = "CF_SQL_INTEGER" null = "yes">, 
    plus4 = <cfqueryparam value = "#form.plus4#" cfsqltype = "CF_SQL_INTEGER" null = "yes">, 
    area_code = <cfqueryparam value = "#form.area_code#" cfsqltype = "CF_SQL_INTEGER" null = "yes">, 
    prefix = <cfqueryparam value = "#form.prefix#" cfsqltype = "CF_SQL_INTEGER" null = "yes">, 
    suffix = <cfqueryparam value = "#form.suffix#" cfsqltype = "CF_SQL_INTEGER" null = "yes"> 
  WHERE personid = #get_personid.personid#
</cfquery>

1 Ответ

4 голосов
/ 07 апреля 2020

Первым делом первым делом. Пожалуйста, используйте cfqueryparam, для всех пользовательских вводов, когда вы используете его в запросе. Поля #form.firstname#, #form.lastname#, etc все должны быть в cfqueryparam, чтобы предотвратить SQL Инъекцию.

Проблема, с которой вы здесь сталкиваетесь, заключается в неправильном использовании атрибута NULL тега cfqueryparam.

Параметр null должен быть выражением, результатом которого будет true или false. Если в качестве значения указать yes напрямую, результат будет выглядеть следующим образом.

suffix = NULL

Теперь давайте посмотрим, как использовать атрибут null.

<cfqueryparam
  value = "#form.suffix#"
  cfsqltype = "CF_SQL_INTEGER"
  null = "#len(trim(form.suffix)) EQ 0#"
> 

Приведенное выше будет гарантировать, что NULL будет передано в качестве значения столбца, если form.suffix пусто. Вы можете изменить эту проверку, основываясь на логике вашего приложения c.

Кроме того, в более новых версиях (CF 11 +) не требуется префикс CF_SQL_ в атрибуте type.

Таким образом, окончательный запрос должен выглядеть примерно так:

<cfquery name="updt_person" datasource="#application.datasource#">
  UPDATE tblperson 
  SET 
    firstname = <cfqueryparam value = "#form.firstname#" cfsqltype = "VARCHAR">, 
    lastname = <cfqueryparam value = "#form.lastname#" cfsqltype = "VARCHAR">, 
    address_line_1 = <cfqueryparam value = "#form.address_line_1#" cfsqltype = "VARCHAR">, 
    address_line_2 = <cfqueryparam value = "#form.address_line_2#" cfsqltype = "VARCHAR">, 
    city = <cfqueryparam value = "#form.city#" cfsqltype = "VARCHAR">, 
    stateid = <cfqueryparam value = "#form.stateid#" cfsqltype = "VARCHAR">, 
    zip = <cfqueryparam value = "#form.zip#" cfsqltype = "INTEGER" null = "#len(trim(form.zip)) EQ 0#">, 
    plus4 = <cfqueryparam value = "#form.plus4#" cfsqltype = "INTEGER" null = "#len(trim(form.plus4)) EQ 0#">, 
    area_code = <cfqueryparam value = "#form.area_code#" cfsqltype = "INTEGER" null = "#len(trim(form.area_code)) EQ 0#">, 
    prefix = <cfqueryparam value = "#form.prefix#" cfsqltype = "INTEGER" null = "#len(trim(form.prefix)) EQ 0#">, 
    suffix = <cfqueryparam value = "#form.suffix#" cfsqltype = "INTEGER" null = "#len(trim(form.suffix)) EQ 0#"> 
  WHERE personid = <cfqueryparam value = "#get_personid.personid#" cfsqltype = "INTEGER">
</cfquery>
...