sud*_*iya 0 mysql sql-server coldfusion
我为我的应用程序创建了一个搜索表单.我现在想要通过从productID,ProductName,ProductCostFrom,ProductCostTO一次从1个或多个输入中获取输入来搜索数据库.我正在使用以下查询进行搜索.如果我在输入中给出成本范围,它工作安静,但如果我只搜索"ProID"或"ProName"或两者,则会出现语法错误.
<cfquery name="myquery" datasource="cfdb2">
Select *
from ProEntry
where (
Procost BETWEEN #Form.Procost# AND #Form.ProCostTo#
)
OR (
Proid='#form.Proid#' OR
Proname='#form.Proname#'
)
</cfquery>
Run Code Online (Sandbox Code Playgroud)
请记住,您发送到数据库的任何查询都必须是有效的 SQL.如果缺少成本值(或包含非数字值),则生成的SQL将格式错误.如果两个字段都为空,则where子句将如下所示(错误):
where ( Procost BETWEEN AND )
Run Code Online (Sandbox Code Playgroud)
..而不是这个:
where ( Procost BETWEEN 50 AND 100 )
Run Code Online (Sandbox Code Playgroud)
如果搜索值是可选的,则需要有条件地构建SQL语句.一种常见的方法是从一个永远不会出现的静态条件开始,因此如果其他过滤器匹配,查询只返回记录:
WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)
只有在填充了必要的表单字段时才附加过滤器.虽然总是使用cfqueryparam来防止sql注入.
<cfif isNumeric(form.Procost) AND isNumeric(form.ProCostTo)>
OR (
Procost BETWEEN
<cfqueryparam value="#form.Procost#" cfsqltype="{replace_with_your_type}">
AND
<cfqueryparam value="#form.ProCostTo#" cfsqltype="{replace_with_your_type}">
)
</cfif>
<cfif len(trim(form.proID))>
OR Proid= <cfqueryparam value="#form.proID#" cfsqltype="{replace_with_your_type}">
</cfif>
... etcetera ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |