2009-03-03 9 views
0

Je n'arrive pas à comprendre pourquoi, lorsque cfquery s'exécute dans mon code, il ne renvoie qu'une ligne alors qu'il devrait renvoyer trois lignes.Coldfusion - cfquery ne renvoie pas les données correctes

Dans presque tous les cas, cette requête renvoie les données correctes. Pour un ou deux utilisateurs, cfquery retourne seulement 1 ligne (sur 3). Je prends la sortie de l'information de débogage que coldfusion crache et exécute cette requête dans le crapaud et les résultats corrects sont montrés.

En quoi les résultats cfquery et crapaud peuvent-ils être différents? L'une des colonnes que je retourne est définie par l'utilisateur et peut-être que la colonne contient des caractères spéciaux qui ne retournent pas le résultat? Je suis vraiment perplexe et personne ici ne sait que je peux me permettre d'y réfléchir. Alors je me tourne vers SO.

Je recherche sur le web en ce moment même.

AJOUTEE:

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

Encore une fois, on quelques utilisateurs, il renvoie une ligne sur trois et sur le reste, il semble revenir les toutes les resuts correctes.

**** MISE À JOUR **** Pas que quelqu'un se soucie, mais juste Aujourd'hui ce problème a été résolu! Si tu veux savoir ce que c'est, je te le dirai.

Il s'avère que le testeur qui testait ce morceau de code (qui prétendait qu'elle nettoyait sa cache!) N'a pas vidé sa cache! Elle m'a fait courir en essayant de réparer ça quand elle me nourrissait de B.S. après je lui ai dit que c'était le problème probable. Eh bien, je n'y ai pas passé trop de temps. Merci à tous pour les réponses sur le cfqueryparam, je les utiliserai dorénavant dans mon codage coldfusion.

À la votre!

+0

pourriez-vous partager avec nous le sql réel et cfquery? –

+0

Je déboguerais en utilisant d'abord la valeur sans session. :) – Henry

Répondre

0


Utilisez toujours cfqueryparam autour de variables dans vos requêtes!

Bon, maintenant qui est hors de la voie, il n'y a rien dans ce code qui fera que l'une des trois lignes à renvoyer. Par conséquent, votre problème est lié aux données ou ailleurs dans le code.

Si vous immédiatement après cette requête ne:

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

Est-ce que vous obtenez une ligne ou trois lignes?

  • S'il est une ligne, qui suggère un problème de données - Je doute non-ascii caractères « spéciaux » serait la cause, mais essayer de retourner juste un entier pour vérifier que - ou même SELECT 1 ... - s'il y a trois lignes vous obtiendriez trois 1s.

  • S'il y a trois lignes, il doit y avoir un code postérieur qui cause le problème, donc nous aurions besoin de savoir ce qui se passe à côté pour pouvoir vous aider.

Avez-vous un sens?

+0

Malheureusement, ce n'est pas si facile. Je n'ai pas vraiment accès à la base de données ou à l'accès direct au système, j'ai donc ajouté dans votre suggestion sur les informations de sélection et de bouclage/sortie sur le compte et je vais demander à quelqu'un de m'envoyer la source de la page question. Truc amusant... – user16208

0

J'utiliserais cfqueryparam pour définir le type de variable que vous entrez dans votre requête.

Il ne me fait jamais de mal d'être trop spécifique avec les requêtes de base de données et j'ai déjà rencontré des problèmes avec des entiers étant évalués comme des chaînes et renvoyant donc des ensembles de résultats incorrects.

(Ajouté (principale) de bonus - cfqueryparam est toujours bon pour une protection supplémentaire contre les attaques par injection SQL)

0

Je suppose que l'erreur est dans les données ou votre entrée (la session a expiré/invalide?).

En fait, j'ai jamais a été témoin d'un résultat <cfquery> différant de ce que le serveur DB vous dirait sur la console. C'est tellement improbable que je ne considérerais pas cela comme une possibilité.

Je propose le scénario de test suivant:

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

Vous y verrez exactement combien d'enfants chaque utilisateur.

Si elle vous fait sentir plus en sécurité, vous pouvez exécuter une boucle et vérifier les résultats individuellement:

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

Mon pari serait que le <cfabort> est jamais être touché, ce qui prouverait que <cfquery> fonctionnait parfaitement et il faudrait chercher ailleurs.

Questions connexes