2009-03-03 97 views
0

我很難弄清楚爲什麼當我的代碼中運行cfquery時,它應該返回三行時只返回一行。Coldfusion - cfquery不返回正確的數據

在幾乎所有情況下,這個cfquery都返回正確的數據。對於一個或兩個用戶,cfquery只返回1行(滿分3)。我從coldfusion吐出的調試信息中獲取輸出並在蟾蜍中運行該查詢,並顯示正確的結果。

什麼可能導致cfquery和蟾蜍結果不同?我返回的其中一列是用戶定義的,也許列中有一些特殊字符會導致結果不被返回?我真的很難過,沒有人知道任何coldfusion甚至可以幫助我思考這個問題。所以我轉向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

你可以與我們分享實際的sql和cfquery嗎? – 2009-03-03 20:51:00

+0

我會先使用非會話值進行調試。 :) – Henry 2009-03-04 18:10:09

回答

0


總是在您的查詢中圍繞變量使用cfqueryparam

權,這才叫出的方式,沒有什麼代碼,這將導致返回只有三個中的一個行。

所以,你的問題是數據相關的或代碼中的其他地方。

如果立即該查詢後做:

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

你得到一個排或三排?

  • 如果是一排,這說明數據的問題 - 我懷疑非ascii「特殊」字符會導致此,但儘量只返回一個整數,以測試 - 甚至SELECT 1 ... - 如果有三個行你會得到三個1。

  • 如果在那裏有三行,它必須是一些後來導致問題的代碼,所以我們需要知道接下來發生了什麼才能提供幫助。

有意義嗎?

0

我會使用cfqueryparam來定義您輸入到查詢中的變量的類型。

它從來沒有傷害過於具體的數據庫查詢和我遇到過整數被評估爲字符串,因此返回不正確的結果集的問題。

(添加(主)獎金 - cfqueryparam總是好的針對SQL注入攻擊額外的保護)

0

我認爲錯誤是在數據或您的輸入(會話超時/無效?)。

其實我從來沒有目擊<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>都進展順利運作,你必須去別的地方看看。