Coldfusion - cfquery не возвращает корректные данные [закрыто]

StackOverflow https://stackoverflow.com/questions/608104

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне трудно понять, почему, когда cfquery выполняется в моем коде, он возвращает только одну строку, когда он должен возвращать три строки.

Почти во всех случаях этот cfquery возвращает правильные данные.Для одного или двух пользователей cfquery возвращает только 1 строку (из 3).Я беру выходные данные из отладочной информации, которую выдает coldfusion, и запускаю этот запрос в toad, и отображаются правильные результаты.

Что может привести к тому, что результаты cfquery и toad будут отличаться?Один из столбцов, которые я возвращаю, определяется пользователем, и, возможно, в столбце есть какие-то специальные символы, из-за которых результат не возвращается?Я действительно в тупике, и никто здесь не знает ни одного coldfusion, который хотя бы помог бы мне подумать об этом.Поэтому я обращаюсь к SO.

Пока мы разговариваем, я ищу в Интернете.

ДОБАВЛЕНО:

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

Опять же, одному из нескольких пользователей он возвращает одну строку из трех, а остальным, похоже, возвращает все правильные повторные запросы.

**** ОБНОВЛЕНИЕ **** Не то чтобы кого-то это волновало, но только сегодня эта проблема была решена!Если ты хочешь знать, что это было, я тебе расскажу.

Оказывается, тестировщица, которая тестировала этот фрагмент кода (которая утверждала, что она очищала свой кэш!), не очистила свой кэш!Она заставила меня бегать вокруг, пытаясь починить его, когда кормила меня Би-эс.после того, как я сказал ей, что это вероятная проблема.Ну что ж, я не потратил на это слишком много времени.Спасибо всем за ответы о cfqueryparam, с этого момента я буду использовать их в своем коде coldfusion.

Ваше здоровье!

Это было полезно?

Решение


Всегда используйте cfqueryparam обходите переменные в ваших запросах!

Правильно, теперь с этим покончено, в этом коде нет ничего, что привело бы к возврату только одной из трех строк.

Итак, ваша проблема связана либо с данными, либо с чем-то еще в коде.

Если вы немедленно после этого выполните запрос:

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

У вас получается один ряд или три ряда?

  • Если это одна строка, это наводит на мысль о проблеме с данными - я сомневаюсь, что "специальные" символы, отличные от ascii, могут вызвать это, но попробуйте вернуть только целое число, чтобы проверить это - или даже SELECT 1 ... - если есть три строки, вы получите три единицы.

  • Если там есть три строки, это должен быть какой-то более поздний код, который вызывает проблему, поэтому нам нужно было бы знать, что происходит дальше, чтобы иметь возможность помочь.

Есть смысл?

Другие советы

Я бы использовал cfqueryparam для определения типа переменной, которую вы вводите в свой запрос.

Никогда не помешает быть слишком конкретным с запросами к базе данных, и я уже сталкивался с проблемами, когда целые числа вычислялись как строки и, следовательно, возвращали неправильные результирующие наборы.

(Добавлен (основной) бонус - cfqueryparam всегда полезен для дополнительной защиты от атак SQL-инъекций)

Я полагаю, ошибка в данных или ваших входных данных (время ожидания СЕАНСА истекло / недействительно?).

На самом деле, я никогда стал свидетелем <cfquery> результат отличается от того, что сервер базы данных сообщил бы вам на консоли.Просто это настолько невероятно, что я бы не рассматривал такую возможность.

Я предлагаю следующий тестовый сценарий:

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

Там вы точно увидите, сколько детей у каждого пользователя.

Если так вы почувствуете себя в большей безопасности, вы можете запустить цикл и проверить результаты по отдельности:

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

Я бы поспорил, что <cfabort> никогда не подвергается удару, что доказывало бы, что <cfquery> функционировал безупречно, и вам пришлось бы искать где-нибудь в другом месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top