2009-03-03 27 views
0

Es fällt mir schwer herauszufinden, warum, wenn die cfquery in meinem Code ausgeführt wird, nur eine Zeile zurückgegeben wird, wenn sie drei Zeilen zurückgeben soll.Coldfusion - cfquery gibt keine korrekten Daten zurück

In fast allen Fällen gibt diese cfquery die richtigen Daten zurück. Für einen oder zwei Benutzer gibt die cfquery nur 1 Zeile (von 3) zurück. Ich nehme die Ausgabe von den Debug-Informationen, die Coldfusion ausspuckt und diese Abfrage in Kröte ausführen, und die richtigen Ergebnisse werden angezeigt.

Was könnte dazu führen, dass die Ergebnisse von cfquery und toad unterschiedlich sind? Eine der Spalten, die ich zurückgebe, ist benutzerdefiniert und möglicherweise enthält die Spalte einige Sonderzeichen, die dazu führen, dass das Ergebnis nicht zurückgegeben wird? Ich bin wirklich ratlos und niemand hier in der Gegend kennt eine Erkältung, die mir hilft, darüber nachzudenken. Also wende ich mich an SO.

Ich suche im Internet, wie wir sprechen.

ADDED:

<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> 

Wieder ein wenige Benutzer es eine Reihe von drei zurückkehrt und auf dem Rest scheint es, die alle richtigen resuts zurückzukehren.

**** UPDATE **** Nicht, dass sich jemand kümmert, aber nur Heute Dieses Problem wurde behoben! Wenn du wissen willst, was es war, werde ich es dir sagen.

Stellt sich heraus, dass der Tester, der dieses Stück Code getestet hat (wer behauptete, dass sie ihren Cache löschte!) Ihren Cache nicht löschte! Sie ließ mich rumlaufen und versuchte es wieder in Ordnung zu bringen, als sie mir einige B.S. nachdem ich ihr gesagt hatte, dass das das wahrscheinliche Problem war. Naja, ich habe nicht zu viel Zeit damit verbracht. Danke an alle für die Antworten zum cfqueryparam, ich werde diese von nun an in meiner Coldfusion-Kodierung verwenden.

Prost!

+0

können Sie uns die tatsächliche SQL und cfquery teilen? –

+0

Ich würde zuerst mit Nicht-Session-Wert debuggen. :) – Henry

Antwort

0


Verwenden Sie immer cfqueryparam um Variablen in Ihren Abfragen!

Richtig, jetzt, dass aus dem Weg ist, gibt es nichts in diesem Code, der nur einer von drei Reihen verursachen wird zurückgeführt werden.

Ihr Problem ist also entweder datenbezogen oder an anderer Stelle im Code.

Wenn Sie sofort nach dieser Abfrage tun:

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

Haben Sie eine Zeile oder drei Reihen bekommen?

  • Wenn es eine Zeile ist, dass schlägt vor, eine Datenausgabe - ich zweifle nicht-ascii ‚besondere‘ Zeichen würde dies dazu führen, sondern nur versuchen, eine ganze Zahl zurückkehrt, dass zu testen - oder sogar SELECT 1 ... - wenn es drei sind Reihen würden Sie drei 1s bekommen.

  • Wenn es drei Zeilen gibt, muss es ein späterer Code sein, der das Problem verursacht, also müssten wir wissen, was als nächstes passiert, um zu helfen.

Sinn machen?

+0

unglücklicherweise ist es nicht so einfach. Ich habe nicht wirklich Zugriff auf die Datenbank oder direkten Zugriff auf das System, also fügte ich in Ihrem Vorschlag auf die Auswahl und Loop-Through/Ausgabe Informationen über die Zählung auf diesem und jemand hat mir die Quelle der Seite in Frage. Lustige Sachen... – user16208

0

Ich würde cfqueryparam verwenden, um den Typ der Variablen zu definieren, die Sie in Ihre Abfrage eingeben.

Es tut nie weh, zu spezifisch mit Datenbankabfragen zu sein, und ich habe Probleme vorher mit Integers gefunden, die als Zeichenfolgen ausgewertet werden und deshalb falsche Resultsets zurückgeben.

(Added (Haupt-) Bonus - cfqueryparam für zusätzlichen Schutz gegen SQL-Injection-Angriffe sind immer gut)

0

Ich nehme an, die Fehler in den Daten oder Ihre Eingabe (SESSION Zeitüberschreitung/ungültig?).

Eigentlich habe ich nie Zeuge ein <cfquery> Ergebnis davon, was der DB-Server Ihnen auf der Konsole sagen würde. Es ist so unwahrscheinlich, dass ich es nicht für möglich halte.

Ich schlage vor, das folgende Testszenario:

<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#"> 

Dort finden Sie genau sehen, wie viele Kinder hat jeden Benutzer.

Wenn es Sie macht sich sicherer fühlen, können Sie eine Schleife ausführen und die Ergebnisse einzeln prüfen:

<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> 

Meine Wette wäre, dass die <cfabort> nie getroffen zu werden ist, was beweisen würde, dass <cfquery> einwandfrei funktionierte und Du musst woanders hinschauen.

Verwandte Themen