Pergunta

Eu estou tendo um momento difícil descobrir por que quando os cfquery corre no meu código só está retornando uma linha quando ele deve estar retornando três linhas.

Em quase todos os casos isso cfquery está retornando os dados corretos. Para um ou dois usuários do cfquery está retornando somente 1 linha (de 3). Tomo a saída da informação de depuração que o ColdFusion cospe e executar essa consulta em sapo e os resultados corretos são mostrados.

O que poderia fazer com que os resultados cfquery e sapo de ser diferente? Uma das colunas Eu estou retornando é definida pelo usuário e, talvez, a coluna tem alguns caracteres especiais nele que causam o resultado a não ser devolvido? Estou realmente perplexo e ninguém aqui conhece algum ColdFusion até mesmo ajuda-me pensar sobre isso. Então eu me viro para SO.

Estou pesquisando na web como nós falamos.

ADICIONADO:

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

Mais uma vez, alguns usuários que retorna uma linha de três e no resto parece retornar os todos os resuts corretas.

**** ATUALIZAÇÃO **** Não que alguém se importa, mas apenas Hoje, este problema foi resolvido! Se você quer saber o que foi que eu vou te dizer.

Acontece que o testador que estava testando este pedaço de código (que alegou que ela estava limpando a cache do!) Não limpar seu esconderijo! Ela tinha me correndo ao redor tentando consertá-la quando ela estava me alimentando alguns B. S. depois que eu disse a ela que era o problema provável. Oh bem, eu não gastar muito tempo com ele. Obrigado a todos pelas respostas sobre a cfqueryparam, eu vou estar usando aqueles a partir de agora na minha coldfusion codificação.

Felicidades!

Foi útil?

Solução


Sempre uso cfqueryparam torno variáveis ??em suas consultas!

Certo, agora que está fora do caminho, não há nada em que o código que fará com que apenas uma das três linhas a serem devolvidos.

Assim, o seu problema é um ou em outras partes do código relacionado a dados.

Se você imediatamente , após essa consulta fazer:

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

Você recebe uma linha ou três linhas?

  • Se for uma linha, que sugere um problema de dados - Duvido não-ascii caracteres 'especiais' poderia causar isso, mas tentar retornar apenas um inteiro para teste que - ou mesmo SELECT 1 ... - se houver três linhas você iria ficar três 1s.

  • Se houver três fileiras lá, deve haver algum código mais tarde que está causando o problema, por isso, seria preciso saber o que está acontecendo ao lado ser capaz de ajuda.

faz sentido?

Outras dicas

Gostaria de usar cfqueryparam para definir o tipo de variável que você está entrando em sua consulta.

Ela nunca danifica a ser muito específico com consultas de banco de dados e eu deparei com problemas antes com inteiros sendo avaliada como cordas e, portanto, retornar conjuntos de resultados incorretos.

(Acrescentado (principal) de bônus - cfqueryparam é sempre bom para maior proteção contra ataques de injeção SQL)

Eu suponho que o erro está nos dados ou a sua entrada (SESSÃO esgotado / inválida?).

Na verdade, eu não testemunhou um resultado <cfquery> diferindo do que o servidor DB iria dizer-lhe sobre o console. É tão improvável que eu não iria considerá-lo uma possibilidade.

Eu sugiro o seguinte cenário de teste:

<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á você vai ver exatamente quantas crianças cada usuário tem.

Se isso faz você se sentir mais seguro, você pode executar um loop e verificar os 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>

A minha aposta seria que o <cfabort> não está sendo atingido, o que provaria que <cfquery> estava funcionando perfeitamente e você tem que procurar em outro lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top