2008-11-05 4 views
11

Я кодирование в ColdFusion, но пытаюсь остаться в cfscript, поэтому у меня есть функция, которая позволяет мне передать в запросе, чтобы запустить его с <cfquery blah > #query# </cfquery>ColdFusion добавляя дополнительные кавычки при построении запросов к базе данных в строках

Как-то хотя, когда я строю свои запросы с sql = "SELECT * FROM a WHERE b='#c#'" и передаю его, ColdFusion заменил одинарные кавычки на две одинарные кавычки. поэтому в конечном запросе он становится WHERE b=''c''.

Я попытался создать строки много разных способов, но я не могу заставить его оставить только одну цитату. Даже замена строки не влияет.

Любая идея, почему это происходит? Это разрушает мои надежды на проживание в cfscript на протяжении всего этого проекта.

ответ

17

ColdFusion, по дизайну, выделяет одинарные кавычки при интерполяции переменных в пределах <cfquery> тегов.

Чтобы сделать то, что вы хотите, вам необходимо использовать функцию PreserveSingleQuotes().

<cfquery ...>#PreserveSingleQuotes(query)#</cfquery> 

Это не касается, однако, опасности инъекции SQL, которой вы подвергаете себя.

Использование <cfqueryparam> также позволяет вашей базе данных кэшировать запрос, что в большинстве случаев улучшит производительность.

Возможно, было полезно прочитать an old Ben Forta column и a recent post by Brad Wood для получения дополнительной информации о преимуществах использования <cfqueryparam>.

4

ColdFusion автоматически ускользает одиночные кавычки кавычки в <cfquery> теги, когда используется следующий синтаксис:

SELECT * FROM TABLE WHERE Foo='#Foo#' 

В случае, если вы хотите сохранить одиночные кавычки в #Foo# вы должны вызвать #PreserveSingleQuotes(Foo)#.

Помните, что автоматическое экранирование работает только для значений переменных, а не для результатов функции.

SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */ 

В этом свете, функция PreserveSingleQuotes() (см Adobe LiveDocs) не намного больше, чем «нулевая операция» по значению - превращая его в результат функции обход авто-ускользающий.

6

Ответ на ваш вопрос, как уже говорили другие, использует preserveSingleQuotes(...)

Однако, решение вы на самом деле хотите, это не динамически создавать свои запросы таким образом. Это плохо плохо.

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

(Обратите внимание, что если вы используете переменные в ORDER BY предложения, вам нужно вручную избежать какого-либо переменными, cfqueryparam не может быть использован в ORDER BY положений)

0

Я проголосовал ответ Дэйва, так как я думал, он сделал хорошую работу.

Я хотел бы добавить, однако, что есть несколько различных инструментов, предназначенных для ColdFusion, которые могут упростить многие обычные задачи SQL, которые вы, вероятно, будете выполнять. Есть очень легкий инструмент под названием DataMgr, написанный Стивом Брайантом, а также Transfer от Mark Mandel, Reactor, который изначально созданный Doug Hughes и один из тех, который я разработал под названием DataFaucet. У каждого из них свои сильные и слабые стороны. Лично я думаю, что вы склонны рассматривать DataFaucet таким образом, чтобы дать вам лучшую возможность оставаться в cfscript с помощью различных синтаксисов для создания различных запросов.

Вот несколько примеров:

qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8) 

qry = datasource.select("avg(price) as avgprice","products"); 

qry = datasource.getSelect("avg(price) as avgprice","products").filter("categoryid",url.categoryid).execute(); 

qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute(); 


Каркас гарантирует, что cfqueryparam всегда используется с этими утверждениями фильтров для предотвращения атак SQL-инъекций, и есть аналогичные Синтаксисы для вставки, обновления и удаления заявления , (Есть пара simple rules to avoid sql-injection.)