我很难弄清楚为什么当 cfquery 在我的代码中运行时它只返回一行,而它应该返回三行。

几乎在所有情况下,此 cfquery 都会返回正确的数据。对于一两个用户,cfquery 仅返回 1 行(共 3 行)。我从 Coldfusion 吐出的调试信息中获取输出,并在 Toad 中运行该查询,并显示正确的结果。

什么可能导致 cfquery 和 toad 结果不同?我返回的列之一是用户定义的,也许该列中有一些特殊字符导致结果不返回?我真的很困惑,这里没有人知道任何冷融合可以帮助我思考这个问题。所以我转向SO。

我们说话的时候我正在网上搜索。

添加:

<cfquery name="getInfo" datasource="#DSN#">
    SELECT
        u.user_no, u.username, u.description
    FROM
        user_info u
    WHERE
        u.parent = #session.user_no#
    ORDER BY 
        u.username ASC
</cfquery>

同样,对于少数用户,它返回三行中的一行,而在其余用户中,它似乎返回所有正确的结果。

更新**** 不是说没有人在乎,但只是今天这个问题解决了!如果你想知道那是什么我就告诉你。

事实证明,正在测试这段代码的测试人员(声称她正在清除缓存!)并没有清除她的缓存!当她给我灌输一些废话时,她让我四处奔波试图解决这个问题。在我告诉她这可能是问题之后。哦,好吧,我没有花太多时间在这上面。感谢大家关于 cfqueryparam 的答案,从现在开始我将在我的 Coldfusion 编码中使用这些答案。

干杯!

有帮助吗?

解决方案


总是使用 cfqueryparam 围绕查询中的变量!

是的,现在已经解决了,该代码中没有任何内容会导致仅返回三行之一。

因此,您的问题要么与数据相关,要么与代码中的其他位置有关。

如果你 立即地 在该查询之后执行:

<cfdump var="#getInfo#"/><cfabort/>

你买一排还是三排?

  • 如果是一行,则表明存在数据问题 - 我怀疑非 ASCII“特殊”字符会导致此问题,但尝试仅返回一个整数来测试 - 甚至 SELECT 1 ... - 如果有三行,您将得到三个 1。

  • 如果那里有三行,那么一定是后面的一些代码导致了问题,所以我们需要知道接下来发生了什么才能提供帮助。

合理?

其他提示

我会使用cfqueryparam来定义您在查询中输入的变量类型。

对于数据库查询过于具体而且从来没有因为整数被评估为字符串并因此返回不正确的结果集而遇到问题。

(添加(主要)奖励 - cfqueryparam总是有助于增强对SQL注入攻击的保护)

我想错误是在数据或输入中(SESSION超时/无效?)。

实际上,我永远不会目睹<cfquery>结果与数据库服务器在控制台上告诉你的结果不同。这是不可能的,我不认为这是一种可能性。

我建议采用以下测试方案:

<cfquery name="AllUsers" datasource="#DSN#>
  SELECT 
    p.user_no,
    COUNT(u.user_no) ChildCount
  FROM
    user_info p
    LEFT JOIN user_info u ON p.user_no = u.parent
  GROUP BY
    p.user_no
  ORDER BY
    COUNT(u.user_no)
</cfquery>

<cfdump var="#AllUsers#">

在那里,您将确切地看到每个用户拥有多少个孩子。

如果它让您感觉更安全,可以运行循环并单独检查结果:

<cfloop query="AllUsers">
  <cfquery name="SingleUser" datasource="#DSN#">
    SELECT
      u.user_no, u.username, u.description
    FROM
      user_info u
    WHERE
      u.parent = #AllUsers.user_no#
  </cfquery>

  <cfif SingleUser.RecordCount neq AllUsers.ChildCount>
    <cfabort showerror="space-time rupture found for user #AllUsers.user_no#">
  </cfif>
</cfloop>

我的赌注是<cfabort>永远不会被击中,这将证明<=>正在完美运作,你必须在其他地方寻找。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top