2009-03-03 3 views
0

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

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

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

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

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

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

Cheers!

+0

Вы могли бы поделиться с нами фактическими sql и cfquery? –

+0

Сначала я отлаживал с использованием несезонного значения. :) – Henry

ответ

0


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

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

Таким образом, ваша проблема связана либо с данными, либо в другом месте в коде.

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

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

Вы получаете одну строку или три строки?

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

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

Имеют смысл?

+0

unfortuneatly не так просто. У меня действительно нет доступа к базе данных или прямого доступа к системе, поэтому я добавил в ваше предложение о выборе и циклическом просмотре/выходе информации о счете на этом, и у меня будет кто-то отправить мне источник страницы в вопрос. Веселый материал ... – user16208

0

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

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

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

0

Я предполагаю, что ошибка в данных или ваш вклад (SESSION таймаут/недействительно?).

На самом деле, у меня есть never был свидетелем результата <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> функционирует безупречно и вам придется искать где-то еще.

Смежные вопросы