У меня возникла проблема с попыткой обновить таблицу SQL с помощью этого cfquery. Вот код холодного синтеза:
<CFSET dateTimes=DateFormat(Now(),"mm\dd\yyyy")>
<CFQUERY NAME="updateTime" DATASOURCE="#this_datasource#">
UPDATE users
SET ACTIVITYDATE = CAST(#dateTimes# AS smalldatetime)
WHERE username = '#Form.login_username#'
AND Password = '#Form.Password#'
</CFQUERY>
При попытке выполнить это он дает мне следующее:
Error Executing Database Query. [Macromedia][SQLServer JDBC Driver] [SQLServer]Incorrect syntax near '\25'.
The error occurred on line 19.
Еще одна вещь - это тип sal_var, ACTIVITYDATE - это smalldatetime. Я также пробовал делать это без приведения и просто делал простой # dateTimes # var. Я также пробовал cfqueryparam, который также не работал. Заранее спасибо за вашу помощь!
2 ответа
Cfqueryparam cfsqltype, используемый для значений datetime / smalldatetime в SQL Server, - cf_sql_timestamp. Вы можете переписать код следующим образом:
<CFSET dateTimes=DateFormat(Now(),"mm/dd/yyyy")>
<CFQUERY NAME="updateTime" DATASOURCE="#this_datasource#">
UPDATE users
SET ACTIVITYDATE = <cfqueryparam value="#dateTimes#" cfsqltype="cf_sql_timestamp">
WHERE username = <cfqueryparam value="#Form.login_username#" cfsqltype="cf_sql_varchar">
AND Password = <cfqueryparam value="#Form.Password#" cfsqltype="cf_sql_varchar">;
</CFQUERY>
Чтобы избежать уязвимостей, связанных с внедрением SQL-кода, рекомендуется использовать cfqueryparam.
См .: https://wikidocs.adobe.com/wiki/display/coldfusionen/cfqueryparam а>
cfqueryparam
Измените это:
SET ACTIVITYDATE = CAST(#dateTimes# AS smalldatetime)
К этому:
SET ACTIVITYDATE = GetDate()
Или, если вы не хотите, чтобы компонент времени
SET ACTIVITYDATE = cast(GetDate() as date)
Хотя вы можете отправить переменную ColdFusion, в этом нет необходимости, так зачем беспокоиться?
cfqueryparam>
следует использовать всегда.
cfqueryparam
с переменными, как в исходном примере. В первую очередь для предотвращения внедрения sql, но у него есть и другие преимущества. Однако его нельзя использовать, если значением является функция базы данных, например getDate()
. Причина в том, что cfqueryparam
препятствует выполнению sql, поэтому эти два являются взаимоисключающими.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
cfqueryparam
для значений, которые вы вводите в БД. Затем вы можете избавиться отCAST()
.cfqueryparam
для имени пользователя и пароля.dateFormat()
при передаче даты в БД. Используйте объект даты (в вашем случае подойдет толькоnow()
). Кроме того, как уже говорили другие, не вводите жестко значения параметров в строку SQL, передавайте их как параметры с помощью<cfqueryparam>
. Сначала сделайте все это, а затем давайте посмотрим на ваши ошибки...