Domanda

Sto facendo fatica a capire perché quando il cfquery viene eseguito nel mio codice restituisce solo una riga quando dovrebbe restituire tre righe.

In quasi tutti i casi questo cfquery sta restituendo i dati corretti. Per uno o due utenti, la query restituisce solo 1 riga (su 3). Prendo l'output dalle informazioni di debug che coldfusion sputa ed eseguo quella query in rospo e vengono visualizzati i risultati corretti.

Cosa potrebbe causare differenze nei risultati di rospo e rospo? Una delle colonne che sto restituendo è definita dall'utente e forse la colonna contiene alcuni caratteri speciali che causano la restituzione del risultato? Sono davvero perplesso e nessuno qui conosce la fusione fredda per aiutarmi a pensare a questo. Quindi mi rivolgo a SO.

Sto cercando sul web mentre parliamo.

AGGIUNTO:

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

Ancora una volta, uno su alcuni utenti restituisce una riga su tre e per il resto sembra restituire tutti i risultati corretti.

**** AGGIORNAMENTO **** Non che a nessuno importa, ma proprio oggi questo problema è stato risolto! Se vuoi sapere di cosa si tratta, te lo dirò.

Si scopre che il tester che stava testando questo pezzo di codice (che ha affermato che stava svuotando la sua cache!) non ha cancellato la sua cache! Mi fece correre in giro cercando di aggiustarlo mentre mi dava da mangiare per B.S. dopo che le ho detto che quello era il probabile problema. Oh bene, non ci ho passato troppo tempo. Grazie a tutti per le risposte su cfqueryparam, userò quelle da ora in poi nel mio codice di fusione fredda.

Cheers!

È stato utile?

Soluzione


Usa sempre cfqueryparam attorno alle variabili nelle tue query!

Bene, ora è fuori mano, non c'è nulla in quel codice che causi la restituzione di una sola delle tre righe.

Quindi, il tuo problema è relativo ai dati o altrove nel codice.

Se immediatamente dopo quella query fai:

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

Ricevi una o tre righe?

  • Se si tratta di una riga, ciò suggerisce un problema di dati - dubito che caratteri 'speciali' non ascii lo causerebbero, ma prova a restituire solo un numero intero per testarlo - o anche SELECT 1 ... - se ci sono tre righe otterrai tre 1.

  • Se ci sono tre righe lì, deve esserci un codice successivo che sta causando il problema, quindi dovremmo sapere cosa sta succedendo per poter aiutare.

Ha senso?

Altri suggerimenti

Vorrei usare cfqueryparam per definire il tipo di variabile che stai inserendo nella tua query.

Non fa mai male essere troppo specifici con le query del database e ho riscontrato problemi prima con interi che venivano valutati come stringhe e quindi restituendo set di risultati errati.

(Bonus (principale) aggiunto - cfqueryparam è sempre utile per una maggiore protezione dagli attacchi di iniezione SQL)

Suppongo che l'errore sia nei dati o nel tuo input (SESSIONE scaduta / non valida?).

In realtà, non ho mai visto mai un risultato <cfquery> diverso da quello che il server DB ti avrebbe detto sulla console. È così improbabile che non lo considero una possibilità.

Suggerisco il seguente scenario di prova:

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

Lì vedrai esattamente quanti figli ha ciascun utente.

Se ti fa sentire più sicuro, puoi eseguire un ciclo e controllare i risultati singolarmente:

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

La mia scommessa sarebbe che il <cfabort> non è mai stato colpito, il che dimostrerebbe che <=> funzionava perfettamente e che avresti dovuto cercare altrove.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top