Pregunta

Estoy teniendo dificultades para entender por qué cuando el cfquery se ejecuta en mi código, solo devuelve una fila cuando debería devolver tres filas.

En casi todos los casos, esta consulta devuelve los datos correctos. Para uno o dos usuarios, cfquery devuelve solo 1 fila (de 3). Tomo el resultado de la información de depuración que ColdFusion escupe y ejecuto esa consulta en sapo y se muestran los resultados correctos.

¿Qué podría causar que los resultados de cfquery y sapo sean diferentes? Una de las columnas que estoy devolviendo está definida por el usuario y tal vez la columna tiene algunos caracteres especiales que hacen que el resultado no se devuelva. Estoy realmente perplejo y nadie por aquí conoce alguna fusión fría que incluso me ayude a pensar en esto. Entonces me dirijo a SO.

Estoy buscando en la web mientras hablamos.

AGREGADO:

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

Nuevamente, uno de los pocos usuarios devuelve una fila de tres y en el resto parece devolver todos los resultados correctos.

**** ACTUALIZACIÓN **** No es que a nadie le importe, ¡pero hoy se resolvió este problema! Si quieres saber de qué se trata, te lo diré.

Resulta que el probador que estaba probando este fragmento de código (¡quien afirmó que estaba limpiando su caché!) ¡no borró su caché! Ella me hizo correr tratando de arreglarlo cuando me estaba dando un poco de B.S. después de que le dije que ese era el problema probable. Oh bueno, no pasé mucho tiempo en eso. Gracias a todos por las respuestas sobre el cfqueryparam, las usaré de ahora en adelante en mi codificación de ColdFusion.

¡Salud!

¿Fue útil?

Solución


¡Utilice siempre cfqueryparam alrededor de variables en sus consultas!

Bien, ahora que está fuera del camino, no hay nada en ese código que causará que solo se devuelva una de las tres filas.

Entonces, su problema está relacionado con los datos o en otra parte del código.

Si inmediatamente después de esa consulta haz:

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

¿Obtiene una o tres filas?

  • Si es una fila, eso sugiere un problema de datos; dudo que los caracteres 'especiales' no ascii causen esto, pero intente devolver solo un número entero para probar eso, o incluso SELECT 1 ..., si hay tres filas obtendrías tres 1s.

  • Si hay tres filas allí, debe haber algún código posterior que esté causando el problema, por lo que necesitaríamos saber qué está sucediendo a continuación para poder ayudar.

¿Tiene sentido?

Otros consejos

Usaría cfqueryparam para definir el tipo de variable que está ingresando en su consulta.

Nunca está de más ser demasiado específico con las consultas de la base de datos y he encontrado problemas antes con enteros que se evalúan como cadenas y, por lo tanto, devuelven conjuntos de resultados incorrectos.

(Bonificación adicional (principal): cfqueryparam siempre es bueno para mayor protección contra ataques de inyección SQL)

Supongo que el error está en los datos o en su entrada (¿SESIÓN ha excedido el tiempo / no es válido?

En realidad, nunca he presenciado un resultado <cfquery> diferente de lo que el servidor de DB le diría en la consola. Es tan improbable que no lo consideraría una posibilidad.

Sugiero el siguiente escenario de prueba:

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

Allí verá exactamente cuántos hijos tiene cada usuario.

Si te hace sentir más seguro, puedes ejecutar un ciclo y verificar los resultados individualmente:

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

Mi apuesta sería que el <cfabort> nunca está siendo golpeado, lo que demostraría que <=> funcionaba perfectamente y que tendría que buscar en otro lado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top