有一个搜索查询,以及我用来生成查询元素的函数
<cffunction name="GetSearchQuery" output="true" returntype="string" access="public">
<cfargument name="arrayName" type="array" required="yes">
<cfargument name="columnName" type="string" required="yes">
<cfargument name="searchtype" type="string" required="no" default="wildcard">
<cfset var o = "">
<cfset var i = "">
<cfset var search_item = "">
<cfset search_item = "(">
<cfloop from="1" to="#ArrayLen(Arguments.arrayName)#" index="o">
<cfif Arguments.arrayName[o][1] EQ #Arguments.columnName#>
<cfloop from="2" to="#ArrayLen(Arguments.arrayName[o])#" index="i">
<cfset search_item = search_item & #Arguments.columnName#>
<cfswitch expression="#Arguments.searchtype#">
<cfcase value="wildcard">
<cfset search_item = search_item & ' LIKE
<cfqueryparam value="%' & #Arguments.arrayName[o][i]# & '%"> AND '>
</cfcase>
<cfcase value="startswith">
<cfset search_item = search_item & ' LIKE
<cfqueryparam value="' & #Arguments.arrayName[o][i]# & '%"> AND '>
</cfcase>
<cfcase value="endswith">
<cfset search_item = search_item & ' LIKE
<cfqueryparam value="%' & #Arguments.arrayName[o][i]# & '"> AND '>
</cfcase>
<cfcase value="exactmatch">
<cfset search_item = search_item & ' =
<cfqueryparam value="' & #Arguments.arrayName[o][i]# & '"> AND '>
</cfcase>
</cfswitch>
</cfloop>
</cfif>
</cfloop>
<cfif Len(search_item) GT 4>
<cfset search_item = Left(search_item, Len(search_item)-4) & ") ">
</cfif>
<cfreturn search_item>
</cffunction>
然后在查询
中调用它SELECT * FROM #request.tablename# WHERE #utilObj.GetSearchQuery(arrsearch, "photonumber", true)# OR #utilObj.GetSearchQuery(arrsearch, "takenby", true)# OR #utilObj.GetSearchQuery(arrsearch, "category", true)# OR #utilObj.GetSearchQuery(arrsearch, "area", true)# OR #utilObj.GetSearchQuery(arrsearch, "description", true)#
但它会导致查询错误
但是在功能中没有cfqueryparam,这很好
例如。 <cfset search_item = search_item & ' LIKE "%' & #Arguments.arrayName[o][i]# & '%" AND '>
我们是否可以动态地将cfqueryparam添加到查询中?
答案 0 :(得分:5)
你不能创建一个包含CFML和输出的字符串,并期望它以某种方式意味着它将被实际执行。
首先,当你停下来思考它时,这有点愚蠢,不是吗? (对不起,我的意思并不是那种意味深长的方式)。并且不要感到难过:我认为我们已经在某个阶段做到了这一点。
其次:CFML在执行之前编译。所以这个过程是(出于所有意图和目的):
因此,使用CFML代码生成字符串的代码直到(4)才会执行,但需要在(2)处返回。除非你能旅行,否则就行不通。
我在博客中讨论过这个问题:“The ColdFusion request/response process”
你可以做一些事情:
Query.cfc
代替<cfquery>
,则可以将占位符放入参数中,并将参数数据单独传递给查询。include
。这将破坏编译时/运行时的事情。它会很慢,因为包含的文件需要在运行之前进行编译。这太丑了。该列表按我的优先顺序处理此问题。
答案 1 :(得分:2)
这是为了回应“我们是否可以动态地将cfqueryparam添加到查询中?”。有,但你必须在cfquery块内完成。这样的事情还可以:
<cfquery>
select SomeFields
from SomeTables
where 1 = 1
<cfif something>
and somefield = <cfqueryparam value="#SomeVariable#">
</cfif>
</cfquery>
你不能做什么,至少在版本9及更低版本上不能做,是使查询参数成为变量的一部分。换句话说,这不会编译。
WhereClause = "where 1=1";
if (something)
WhereClause &= ' and somefield = <cfqueryparam value="#SomeVariable#">';
这或多或少是你的尝试。