Question

J'ai du mal à comprendre pourquoi, lorsque la cfquery est exécutée dans mon code, elle ne renvoie qu'une ligne, alors qu'elle devrait en renvoyer trois.

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

Qu'est-ce qui pourrait rendre les résultats de cfquery et de crapaud différents? 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 empêchent le résultat de revenir. Je suis vraiment perplexe et personne ici ne connait une quelconque coldfusion pour m'aider même à y penser. Alors je me tourne vers SO.

Je cherche sur le Web en ce moment même.

ajouté:

<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, un utilisateur sur quelques renvoie une ligne sur trois et sur le reste, il semble renvoyer tous les résultats corrects.

**** MISE À JOUR **** Ce n'est pas grave, mais aujourd'hui, ce problème a été résolu! Si vous voulez savoir ce que c'était, je vous le dirai.

Il s'avère que le testeur qui testait ce code (qui prétendait vider son cache!) n'a pas vidé son cache! Elle m'a fait courir pour essayer de la réparer quand elle me nourrissait de B.S. après que je lui ai dit que c'était le problème probable. Oh bien, je n'ai pas passé trop de temps dessus. Merci à tous pour les réponses concernant le cfqueryparam, je les utiliserai désormais dans mon codage coldfusion.

Salut!

Était-ce utile?

La solution


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

D'accord, cela n'a plus d'importance, il n'y a rien dans ce code qui ne provoque le renvoi d'une seule des trois lignes.

Votre problème est donc lié aux données ou ailleurs dans le code.

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

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

Avez-vous une ligne ou trois lignes?

  • S'il s'agit d'une seule ligne, cela suggère un problème de données - je doute que des caractères "spéciaux" non ascii soient la cause, mais essayez de ne renvoyer qu'un entier pour le tester - ou même SELECT 1 ... - s'il y en a. trois rangées vous obtiendriez trois 1.

  • S'il y a trois lignes, ce doit être un code postérieur à l'origine du problème. Nous aurions donc besoin de savoir ce qui se passe ensuite pour pouvoir aider.

Avez-vous du sens?

Autres conseils

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

Il n’est jamais inutile d’être trop spécifique avec les requêtes de base de données et j’ai rencontré des problèmes auparavant avec des entiers évalués en tant que chaînes et renvoyant par conséquent des ensembles de résultats incorrects.

(Bonus (principal) ajouté - cfqueryparam est toujours utile pour renforcer la protection contre les attaques par injection SQL)

Je suppose que l'erreur est dans les données ou votre entrée (SESSION dépassée / invalide?).

En fait, je n’ai jamais assisté à un <cfquery> résultat différent de ce que le serveur de base de données vous indiquerait sur la console. Il est tellement improbable que je n’envisage pas cette possibilité.

Je suggère 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 verrez exactement combien d'enfants chaque utilisateur a.

Si cela vous rassure, 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> ne soit jamais touché, ce qui prouverait que <=> fonctionnait parfaitement et que vous auriez à chercher ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top