У меня возникла проблема с попыткой обновить таблицу 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, который также не работал. Заранее спасибо за вашу помощь!

0
Sovr Sov 26 Мар 2014 в 00:45
2
Вы должны использовать cfqueryparam для значений, которые вы вводите в БД. Затем вы можете избавиться от CAST().
 – 
Scott Stroz
26 Мар 2014 в 00:51
1
Вы также должны использовать cfqueryparam для имени пользователя и пароля.
 – 
Scott Stroz
26 Мар 2014 в 00:56
3
Я не проверял это, но я считаю, что вам нужно использовать прямую косую черту вместо обратной косой черты. Кроме того, как было сказано ранее, используйте cfqueryparams, а не CAST.
 – 
Chris Tierney
26 Мар 2014 в 00:57
4
Возможно, более важным, чем отсутствие cfqueryparam (хотя это важная проблема), является то, что вы храните пароль в виде открытого текста, а этого никогда делать не следует.
 – 
Peter Boughton
26 Мар 2014 в 03:21
1
Не используйте dateFormat() при передаче даты в БД. Используйте объект даты (в вашем случае подойдет только now()). Кроме того, как уже говорили другие, не вводите жестко значения параметров в строку SQL, передавайте их как параметры с помощью <cfqueryparam>. Сначала сделайте все это, а затем давайте посмотрим на ваши ошибки...
 – 
Adam Cameron
26 Мар 2014 в 03:21

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

3
Leigh 26 Мар 2014 в 08:44
1
Переменная dateTimes — это строка, а не объект даты. Если значение ColdFusion должно быть передано в базу данных, теперь () является подходящим значением.
 – 
Dan Bracuk
26 Мар 2014 в 02:36
2
ColdFusion преобразует строку в дату — при условии, что она имеет общий формат даты — при передаче данных в базу данных с помощью cfqueryparam
 – 
Scott Stroz
26 Мар 2014 в 16:42
Казалось, что этот способ сделать это работал. Мне нужно дважды проверить БД, как только я получу доступ, но я сделал тестовый запрос в коде, чтобы проверить дату активности, и он вернул правильную дату активности :-).
 – 
Sovr Sov
26 Мар 2014 в 20:43

Измените это:

SET ACTIVITYDATE = CAST(#dateTimes# AS smalldatetime)

К этому:

SET ACTIVITYDATE = GetDate()

Или, если вы не хотите, чтобы компонент времени

SET ACTIVITYDATE = cast(GetDate() as date)

Хотя вы можете отправить переменную ColdFusion, в этом нет необходимости, так зачем беспокоиться?

0
Dan Bracuk 26 Мар 2014 в 01:45
2
cfqueryparam> следует использовать всегда.
 – 
Matt Busche
26 Мар 2014 в 02:16
3
Не при использовании функций базы данных для получения текущей даты и времени.
 – 
Dan Bracuk
26 Мар 2014 в 02:35
Это по-прежнему хорошая привычка, особенно когда пользователь вообще не размещал параметры запроса в своем коде.
 – 
Matt Busche
26 Мар 2014 в 02:41
- Просто чтобы уточнить, вы всегда должны использовать cfqueryparam с переменными, как в исходном примере. В первую очередь для предотвращения внедрения sql, но у него есть и другие преимущества. Однако его нельзя использовать, если значением является функция базы данных, например getDate(). Причина в том, что cfqueryparam препятствует выполнению sql, поэтому эти два являются взаимоисключающими.
 – 
Leigh
26 Мар 2014 в 06:22