В первую очередь я использую CFQUERYPARAM
для предотвращения SQL-инъекций. Поскольку Query-of-Queries (QoQ) не касается базы данных, есть ли логическая причина использовать CFQUERYPARAM в них? Я знаю, что значения, которые не соответствуют cfsqltype
и maxlength
, генерируют исключение, но эти значения уже должны быть проверены до этого и отображать дружественные сообщения (с точки зрения UX).Есть ли логическая причина использовать CFQUERYPARAM в запросе запросов?
ответ
Вот ситуация, когда это проще, на мой взгляд.
<cfquery name="NoVisit" dbtype="query">
select chart_no, patient_name, treatment_date, pr, BillingCompareField
from BillingData
where BillingCompareField not in
(<cfqueryparam cfsqltype="cf_sql_varchar"
value="#ValueList(FinalData.FinalCompareField)#" list="yes">)
</cfquery>
Альтернативой будет использование QuotedValueList. Однако, если что-либо в этом списке значений содержит апостроф, cfqueryparam избежит его. В противном случае мне придется.
Edit начинается здесь
Вот еще один пример, где не с помощью параметров запроса вызывает ошибку.
QueryAddRow(x,2);
QuerySetCell(x,"dt",CreateDate(2001,1,1),1);
QuerySetCell(x,"dt",CreateDate(2001,1,11),2);
</cfscript>
<cfquery name="y" dbtype="query">
select * from x
<!---
where dt in (<cfqueryparam cfsqltype="cf_sql_date" value="#ValueList(x.dt)#" list="yes">)
--->
where dt in (#ValueList(x.dt)#)
</cfquery>
Код, как написано выдает эту ошибку:
Query Of Queries runtime error.
Comparison exception while executing IN.
Unsupported Type Comparison Exception:
The IN operator does not support comparison between the following types:
Left hand side expression type = "DATE".
Right hand side expression type = "LONG".
с параметром запроса, комментировал выше, код выполняется успешно.
Поскольку Query-of-Queries (QoQ) не касается базы данных, есть ли логическая причина использовать CFQUERYPARAM в них? Фактически, это касается базы данных, базы данных, которую вы в настоящее время сохранили в памяти. Данные в этой базе данных все же теоретически могут быть подделаны с помощью какой-то инъекции от пользователя. Это влияет на вашу физическую базу данных - нет. Это влияет на использование данных в вашем приложении - да.
Вы не указали никаких конкретных деталей, но я бы ошибался на стороне осторожности. Если ANY данных, которые вы используете для создания запроса, исходит от клиента, а затем используйте в них cfqueryparam
. Если вы можете гарантировать, что ни один из элементов вашего запроса не приходит от клиента, я думаю, что было бы не использовать cfqueryparam
.
Как в стороне, использование cfqueryparam
также помогает оптимизировать запрос для базы данных, хотя я не уверен, что это верно для запроса запросов. Он также ускользает от персонажей для вас, как апострофы.
Я бы спросил, что вы думаете получить, не используя его? –