В моем приложении ColdFusion 11 с SQL Server 2008-R2 я использую следующий тег cfquery внутри компонента CF:
<cfquery name="result_set" dataSource="#request.dsn_name#">
select name, state from myTable #REReplace(where_clause,"''","'","ALL")#
</cfquery>
Здесь where_clause
— переменная. CF заменяет одну одинарную кавычку двумя, поэтому я использую функцию REReplace, чтобы заменить две одинарные кавычки обратно в одну. Итак, мой запрос меняется, например. от
select name, state from myTable WHERE name IN (''ABC'')
к этому:
select name, state from myTable WHERE name IN ('ABC')
Проблема заключается в том, что значение столбца имени также содержит одинарную кавычку. Например.
select name, state from myTable WHERE name IN ('Smith's bat')
В таких случаях запрос не выполняется. Как я могу решить такие случаи. Я попробовал PreserveSingleQuotes, но возникла та же проблема, что и столбец имеет значения в одинарных кавычках.
ОБНОВЛЕНИЕ
Это приложение было разработано несколько лет назад кем-то, кто использовал ColdFusion MX 7. Первоначальный автор создает динамическую строку для переменной where_clause на основе определенных условий. Это длинный файл cfs с несколькими условиями, используемыми для создания динамической строки для where_clause. Следовательно, использование cfqueryparam может быть либо неприемлемым, либо может потребовать полного пересмотра кода, чего заказчик не допустит.
<cfqueryparam>
). Выполнение этого так, как вы это делаете, чрезвычайно подвержено ошибкам и может привести к SQL-инъекция уязвимость. - person elixenide   schedule 07.11.2015<cfquery>
, используйте вместо этогоqueryExecute()
, что позволит вам поместить заполнители параметров в строку SQL; а затем передать значения параметров в отдельный массив/структуру. Просто не жестко кодируйте значения в строку SQL. Это ужасно, неудобно и опасно. - person Adam Cameron   schedule 07.11.2015queryExecute
должно быть намного проще, поскольку он уже поддерживает динамические строки sql (своего рода). Вместо встраивания значений параметров в строку sql используйте маркер параметров и добавляйте значения в отдельный массив. Затем просто вызовитеqueryExecute(sqlString, parameters)
вместо cfquery. - person Leigh   schedule 14.11.2015