当使用多个cfqueryparam时,cfquery不返回结果

时间:2013-12-02 02:06:28

标签: coldfusion coldfusion-8 cfquery cfqueryparam

当使用多个cfquery时,以下cfqueryparams在ColdFusion中失败;但是,当它们未被使用或仅限于一个或另一个时,查询将返回预期结果:

<cfquery name="getComponent"
 datasource="#Request.DSN#"
 username="#Request.username#"
 password="#Request.password#">
  SELECT *
  FROM tbComponent
    INNER JOIN tbPart ON tbPart.partNo = tbComponent.partNo
    INNER JOIN tbProduct on tbProduct.prodNo = tbComponent.prodNo
  WHERE tbComponent.prodNo = <cfqueryparam value="#URL.prodNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="3" />
    AND tbComponent.compNo = <cfqueryparam value="#URL.compNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="2" />
</cfquery>

数据通过URL传递,如下所示:

http://localhost/index.cfm?prodNo=100&compNo=1

该查询已在SQLPlus中使用有效数据进行测试,并返回预期结果。这个问题似乎仅限于通过URL传递值时,虽然通过post传递它们并且FORM正常工作,所以我怀疑URL中的某些内容是如何被破坏的。已使用cfdump检查数据和查询,并且所有内容都与SQLPlus中用于运行查询的内容相符。

数据库后端是Oracle 11g,据我所知,所有相关的驱动程序都是最新的。任何关于这里可能会发生什么的想法都已经被检查过了。

1 个答案:

答案 0 :(得分:0)

我放入了Oracle的LPAD功能,这样当你传入一两个加长的字符时,它会在它们之前放入适当的间距,因为你的URL缺少%20s。像这样:

<cfquery name="getComponent"
 datasource="#Request.DSN#"
 username="#Request.username#"
 password="#Request.password#">
  SELECT *
  FROM tbComponent
    INNER JOIN tbPart ON tbPart.partNo = tbComponent.partNo
    INNER JOIN tbProduct on tbProduct.prodNo = tbComponent.prodNo
  WHERE tbComponent.prodNo = LPAD(<cfqueryparam value="#URL.prodNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="3" />, 3)
    AND tbComponent.compNo = LPAD(<cfqueryparam value="#URL.compNo#"
                              cfsqltype="CF_SQL_CHAR"
                              maxlength="2" />, 2)
</cfquery>

然后,在需要时填充内容,最多填充列的最大字符长度。您可以将它们更改为2和1,假设至少单个字符将始终传入,因为我假设存在至少某个值的假设,因为没有null属性,检查它是yes或no每个查询参数。