gpt4 book ai didi

sql-server-2008 - 执行数据库查询时出错(WHERE 子句有问题?)

转载 作者:行者123 更新时间:2023-12-04 07:09:15 24 4
gpt4 key购买 nike

我正在尝试使用 CF 变量为 FIELDS 和 WHERE 子句构建一个查询。

我收到以下代码的“执行数据库查询时出错”。当我呈现 CF 变量以提供文字,然后将查询主体基于结果文字时,一切正常。我已经确认 #strFlds# 部分作为变量工作正常,但它似乎在 #strWhere# 部分上令人窒息。为 WHERE 子句使用变量是否有问题? (如果重要,数据源是 SQL-Server 数据库)。

    <cfset strWhere = " WHERE SCHYEAR = '#Form.yrVal#'">
<cfset strFlds = "T1, T2">

<cfquery name="qryFld" datasource="TSQL">
SELECT #strFlds# FROM TABLE1 #strWhere#
</cfquery>

最佳答案

这是因为您构建 SQL 语句的方式在 SQL 本身中硬编码了值,即:

<cfset strWhere = " WHERE SCHYEAR = '#Form.yrVal#'">

其中包含两个 SQL:WHERE SCHYEAR =和一个值:'#Form.yrVal#' .人们不应该真的那样做,事实上,当您的值进一步嵌入表达式中时,ColdFusion 会不遗余力地处理它以降低 SQL 注入(inject)的风险(如果您是将来自 form 的值直接传递到数据库中。这真的是不好的做法。

您需要做的是将您的值作为参数传递给数据库驱动程序。一种方法是将值与它们最终将在 SQL 语句中使用的位置分开。 @Chris 已经向您展示了一种使用内联执行此操作的方法 <cfqueryparam>标签。如果您使用 <cfquery>,这是唯一的方法。标签。

如果您使用的是 ColdFusion 11(顺便说一句,请务必在此处提出问题时指定您使用的是哪个版本的 CF),那么您可以在 SQL 中为参数使用占位符,因此:

<cfset qryFld = queryExecute("
SELECT #strFlds# FROM TABLE1 WHERE SCHYEAR = ?
", [{value=Form.yrVal, cfsqltype="CF_SQL_VARCHAR"}])>

如果您使用的是 CF9-10,则可以使用 Query.cfc 实现同样的事情。

qryFld = new Query(
sql = "SELECT #strFlds# FROM TABLE1 WHERE SCHYEAR = ?",
parameters = [{value=Form.yrVal, cfsqltype="CF_SQL_VARCHAR"}]
).execute().getResult();

使用 <cfquery> 无法以这种方式将值与 SQL 完全分离,这在其实现中有点不足。我为此提出了一张票,你可能想投票给它:Separate parameters from SQL in <cfquery> .

进一步的相关阅读(来 self 的博客):

关于sql-server-2008 - 执行数据库查询时出错(WHERE 子句有问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30333658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com