3

cfquery使用多个时,ColdFusion 中会出现以下错误cfqueryparams;但是,当它们不被使用或仅限于其中一种时,查询会返回预期的结果:

<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,据我所知,所有相关驱动程序都是最新的。关于这里可能发生什么的任何想法,因为似乎已经检查了明显的问题。

4

1 回答 1

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 并假设始终为两者传递至少单个字符,因为我假设至少存在某个值的假设,因为没有空属性检查它是否存在每个查询参数。

于 2014-01-13T21:34:47.903 回答