В моем ColdFusion 11 приложения с SQL Server 2008 R2-я следующий cfquery тег внутри CF компонента:ColdFusion апостроф проблема с SQL Query
<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, но имеет ту же проблему, в которой столбец имеет значения с одинарными кавычками.
UPDATE
Это приложение было разработано лет назад кто-то с помощью ColdFusion MX 7. Первоначально автор создает динамическую строку для where_clause переменной, основанной на определенных условиях. Это длинный файл cfs с несколькими условиями, используемыми для создания динамической строки для where_clause. Следовательно, использование cfqueryparam может быть либо не подходящим, либо может потребовать полного пересмотра кода, который клиент не разрешит.
Гораздо лучший подход - переписать запрос для использования параметров (''). Выполнение этого так, как вы это делаете, крайне подвержено ошибкам и, вероятно, приведет к уязвимости [** SQL injection **] (https://www.owasp.org/index.php/SQL_Injection). –
... и именно поэтому у вас возникла проблема с запросом. Не используйте такой динамический sql. Вместо этого создайте sql внутри cfquery и используйте cfqueryparam для всех параметров (или посмотрите на использование запросов cfscript, которые предлагают немного большую гибкость с параметризованным sql). Это защитит базу данных и устранит этот тип ошибок. – Leigh
Если вы хотите сохранить свою строку SQL за пределами вызова '', вместо этого используйте' queryExecute() ', что позволит вам помещать держатели параметров в строку SQL; а затем передать значения параметров в отдельный массив/struct. Просто * не * жестко закодируйте значения в строку SQL. Это ужасно, неудобно и опасно. –