使用 if 语句构建动态 cfquery - ColdFusion
Build a dynamic cfquery using if statements - ColdFusion
我正在寻找基于从 coldfusion 中的表单提交的值创建查询的最佳方法。
我打算使用 <cfif>
语句创建它,但开始 运行 遇到在 AND 语句后添加逗号但如果它是查询中的最后一个 AND 则不添加的问题。以及确保查询中包含第一个 WHERE。
看下面我的例子:
<cfquery name="reportInfo" datasource="DataSource1">
SELECT *
FROM Basic_Info
<cfif company_name NEQ "false">
WHERE Sold_to_Party = '#company_name#',
<cfelse>
WHERE Sold_to_Party != '',
</cfif>
<cfif user_type EQ "both">
<cfelseif user_type EQ "rittal">
AND Sold_to_Party != 'Distributor Submission',
<cfelseif user_type EQ "distro">
AND Sold_to_Party = 'Distributor Submission',
</cfif>
<cfif status NEQ "false">
AND Status = '#status#'
<cfelse>
AND Status != ''
</cfif>
ORDER BY ID
</cfquery>
您可以看到我在其中添加了 elseif 语句,这样我就可以在不带逗号的情况下添加相同的语句。
WHERE
子句中不需要逗号 - 它无效 SQL.
构建动态 SQL WHERE 子句时,一个快速提示是只使用 'dummy' where 子句。这是一个简单的例子(我没有包括你所有的条款):
<cfquery name="reportInfo" datasource="DataSource1">
SELECT *
FROM Basic_Info
WHERE 1 = 1
<cfif company_name NEQ false>
AND Sold_to_Party = <cfqueryparam value="#company_name#" cfsqltype="CF_SQL_VARCHAR">
<cfelse>
AND Sold_to_Party != <cfqueryparam value="" cfsqltype="CF_SQL_VARCHAR">
</cfif>
<cfif form.user_type EQ "rittal">
AND Sold_to_Party != <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR">
<cfelseif form.user_type EQ "distro">
AND Sold_to_Party = <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR">
</cfif>
<cfif status NEQ "false">
AND Status = <cfqueryparam value="#status#" cfsqltype="CF_SQL_BIT">
</cfif>
ORDER BY ID
</cfquery>
另外需要注意的是 SQL 注入攻击。简而言之,在传递值时始终使用 cfqueryparam
。 cfqueryparam
保护您免受 SQL 注入,并允许数据库引擎在您将不同的值传递给参数时创建和重用执行计划。
如果您不确定要使用哪个 cfsqltype 值,那么这里有一个方便的列表(针对 MySQL):
http://cfsearching.blogspot.co.uk/2010/01/cfqueryparam-matrix-for-mysql-5.html
我正在寻找基于从 coldfusion 中的表单提交的值创建查询的最佳方法。
我打算使用 <cfif>
语句创建它,但开始 运行 遇到在 AND 语句后添加逗号但如果它是查询中的最后一个 AND 则不添加的问题。以及确保查询中包含第一个 WHERE。
看下面我的例子:
<cfquery name="reportInfo" datasource="DataSource1">
SELECT *
FROM Basic_Info
<cfif company_name NEQ "false">
WHERE Sold_to_Party = '#company_name#',
<cfelse>
WHERE Sold_to_Party != '',
</cfif>
<cfif user_type EQ "both">
<cfelseif user_type EQ "rittal">
AND Sold_to_Party != 'Distributor Submission',
<cfelseif user_type EQ "distro">
AND Sold_to_Party = 'Distributor Submission',
</cfif>
<cfif status NEQ "false">
AND Status = '#status#'
<cfelse>
AND Status != ''
</cfif>
ORDER BY ID
</cfquery>
您可以看到我在其中添加了 elseif 语句,这样我就可以在不带逗号的情况下添加相同的语句。
WHERE
子句中不需要逗号 - 它无效 SQL.
构建动态 SQL WHERE 子句时,一个快速提示是只使用 'dummy' where 子句。这是一个简单的例子(我没有包括你所有的条款):
<cfquery name="reportInfo" datasource="DataSource1">
SELECT *
FROM Basic_Info
WHERE 1 = 1
<cfif company_name NEQ false>
AND Sold_to_Party = <cfqueryparam value="#company_name#" cfsqltype="CF_SQL_VARCHAR">
<cfelse>
AND Sold_to_Party != <cfqueryparam value="" cfsqltype="CF_SQL_VARCHAR">
</cfif>
<cfif form.user_type EQ "rittal">
AND Sold_to_Party != <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR">
<cfelseif form.user_type EQ "distro">
AND Sold_to_Party = <cfqueryparam value="Distributor Submission" cfsqltype="CF_SQL_VARCHAR">
</cfif>
<cfif status NEQ "false">
AND Status = <cfqueryparam value="#status#" cfsqltype="CF_SQL_BIT">
</cfif>
ORDER BY ID
</cfquery>
另外需要注意的是 SQL 注入攻击。简而言之,在传递值时始终使用 cfqueryparam
。 cfqueryparam
保护您免受 SQL 注入,并允许数据库引擎在您将不同的值传递给参数时创建和重用执行计划。
如果您不确定要使用哪个 cfsqltype 值,那么这里有一个方便的列表(针对 MySQL): http://cfsearching.blogspot.co.uk/2010/01/cfqueryparam-matrix-for-mysql-5.html