我很难弄清楚为什么当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>
再次,一个用户,它从三个中返回一行,其余的似乎返回所有正确的resuts。
****更新**** 不是有人关心,但只是今天这个问题已经解决了!如果你想知道它是什么我会告诉你。
原来测试这段代码的测试人员(谁声称她正在清理她的缓存!)没有清除她的缓存!当她喂我一些B.S时,她让我跑来跑去试图解决它。在我告诉她这可能是问题之后。哦,我没有花太多时间在上面。感谢所有关于cfqueryparam的答案,我将在我的coldfusion编码中使用那些。
干杯!
答案 0 :(得分:1)
始终对查询中的变量使用cfqueryparam
!
是的,现在已经不在了,该代码中没有任何内容只会导致返回三行中的一行。
因此,您的问题与数据相关或代码中的其他位置。
如果您在该查询后立即 ,请执行以下操作:
<cfdump var="#getInfo#"/><cfabort/>
你有一排还是三排?
如果它是一行,则表明存在数据问题 - 我怀疑非ascii'特殊'字符会导致这种情况,但尝试只返回一个整数来测试它 - 甚至SELECT 1 ...
- 如果有三行你会得到三个1。
如果那里有三行,那么它必须是导致问题的一些后来的代码,所以我们需要知道接下来会发生什么才能提供帮助。
有意义吗?
答案 1 :(得分:0)
我会使用cfqueryparam来定义您在查询中输入的变量类型。
对于数据库查询过于具体而且从来没有因为整数被评估为字符串并因此返回不正确的结果集而遇到问题。
(添加(主要)奖励 - cfqueryparam总是有助于增强对SQL注入攻击的保护)
答案 2 :(得分:0)
我想错误是在数据或输入中(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>
永远不会被击中,这将证明<cfquery>
完美无瑕地运作,你必须在其他地方寻找。