Coldfusion 从函数生成Cfqueryparam的查询

Coldfusion 从函数生成Cfqueryparam的查询,coldfusion,coldfusion-8,cfml,Coldfusion,Coldfusion 8,Cfml,有一个搜索查询和一个生成查询元素的函数 然后在查询中这样调用它 SELECT * FROM #request.tablename# WHERE #utilObj.GetSearchQuery(arrsearch, "photonumber", true)# OR #utilObj.GetSearchQuery(arrsearch, "takenby", true)# OR #utilObj.GetSearchQuery(arrsear

有一个搜索查询和一个生成查询元素的函数

然后在查询中这样调用它

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)# 但它会在查询中导致错误

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,这就很好了。 例如


我们是否可以将cfqueryparam动态添加到查询中?

您不能创建一个包含CFML的字符串并将其输出,而期望它以某种方式实际执行

首先,当你停下来想一想的时候,这有点愚蠢,不是吗?对不起,我不是故意的。别难过:我想我们都在某个阶段做过这件事

第二:CFML是在执行之前编译的。因此,该过程出于所有目的:

请求包含代码的文件 文件中的代码被传递到CF 编译程序 CF编译器输出java字节码 JVM执行java字节码 因此,使用CFML代码生成字符串的代码直到4才执行,但需要返回到2。除非你能穿越时空,否则那是行不通的

我在我的博客中讨论了这一点:

你可以做一些事情:

不要像这样编写动态通用SQL。我们所有人都是在刚开始时这样做的,但很快就会意识到动态/通用SQL从来都不是解决任何问题的好方法。 使用已经存在的一个DB抽象层。CF 9+附带了内置的Hibernate支持。 如果使用Query.cfc而不是,则可以为参数添加占位符,并将参数数据单独传递到查询中。 将动态代码写入磁盘,然后将其包括在内。这将破坏编译时/运行时功能。它会很慢,因为在运行之前需要编译包含的文件。很难看。
这个列表是我处理这个问题的首选顺序。

您不能创建一个包含CFML的字符串并输出它,而期望它以某种方式意味着它将实际执行

首先,当你停下来想一想的时候,这有点愚蠢,不是吗?对不起,我不是故意的。别难过:我想我们都在某个阶段做过这件事

第二:CFML是在执行之前编译的。因此,该过程出于所有目的:

请求包含代码的文件 文件中的代码被传递到CF 编译程序 CF编译器输出java字节码 JVM执行java字节码 因此,使用CFML代码生成字符串的代码直到4才执行,但需要返回到2。除非你能穿越时空,否则那是行不通的

我在我的博客中讨论了这一点:

你可以做一些事情:

不要像这样编写动态通用SQL。我们所有人都是在刚开始时这样做的,但很快就会意识到动态/通用SQL从来都不是解决任何问题的好方法。 使用已经存在的一个DB抽象层。CF 9+附带了内置的Hibernate支持。 如果使用Query.cfc而不是,则可以为参数添加占位符,并将参数数据单独传递到查询中。 将动态代码写入磁盘,然后将其包括在内。这将破坏编译时/运行时功能。它会很慢,因为在运行之前需要编译包含的文件。很难看。
该列表是我处理此问题的首选顺序。

这是对我们是否可以将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#">';

这或多或少就是您所尝试的。

这是对我们是否可以将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#">';
这或多或少就是你所尝试的