ColdFusion -CFQuery가 올바른 데이터를 반환하지 않음 [폐쇄
-
03-07-2019 - |
문제
CFQuery가 내 코드에서 실행될 때 왜 세 행을 반환 해야하는지 1 행만 반환하는 이유를 알아내는 데 어려움을 겪고 있습니다.
거의 모든 경우 에이 CFQuery는 올바른 데이터를 반환합니다. 한두 명의 사용자의 경우 CFQuery는 1 행 (3 개 중 1 개) 만 반환합니다. 나는 냉담이 튀어 나오는 디버그 정보에서 출력을 가져 와서 두꺼비에서 해당 쿼리를 실행하고 올바른 결과가 표시됩니다.
CFQuery 및 두꺼비 결과가 다른 원인은 무엇입니까? 내가 반환하는 열 중 하나는 사용자 정의이며 열에는 특수 문자가있을 수 있습니다. 결과가 반환되지 않습니까? 나는 정말로 그루터기가 많고 여기 주변의 어느 누구도 내가 이것에 대해 생각하는 데 도움이되는 냉담을 모른다. 그래서 나는 그렇게합니다.
우리가 말하는대로 웹에서 검색하고 있습니다.
추가 :
<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>
다시 한 번, 몇 명의 사용자가 3 개 중 한 행을 반환하고 나머지는 올바른 재조정을 모두 반환하는 것 같습니다.
**** 업데이트 **** 아무도 신경 쓰지 말고 오늘이 문제가 해결되었습니다! 당신이 그것이 무엇인지 알고 싶다면 내가 말할 것입니다.
이 코드를 테스트 한 테스터 (캐시를 청소하고 있다고 주장한 사람)는 캐시를 지우지 않았습니다! 그녀는 내가 그녀에게 문제가 될 가능성이 있다고 말한 후 BS를 먹이고있을 때 그것을 고치려고 노력했다. 오 글쎄, 나는 그것에 너무 많은 시간을 보내지 않았다. CFQueryParam에 대한 답변에 감사드립니다. 냉담 코딩에 지금부터 사용될 것입니다.
건배!
해결책
항상 사용하십시오 cfqueryparam
쿼리의 변수 주변!
맞습니다. 이제는 그 길에 있습니다. 해당 코드에는 3 개의 행 중 하나만 반환 할 수있는 것이 없습니다.
따라서 문제는 데이터 관련이거나 코드의 다른 곳입니다.
만약 너라면 즉시 그 쿼리 후 :
<cfdump var="#getInfo#"/><cfabort/>
당신은 한 줄 또는 3 개의 행을 얻습니까?
데이터 문제를 암시하는 행이 하나 인 경우 - ASCII가 아닌 '특별'문자 가이 일을 일으킬 것이라고 의심하지만 정수만으로 반환하여 테스트합니다.
SELECT 1 ...
- 세 행이 있으면 3 개의 행이 있습니다.3 개의 행이 있으면 나중에 문제를 일으키는 코드가 있어야하므로 다음에 무슨 일이 일어나고 있는지 알아야합니다.
이해가 되나요?
다른 팁
CFQueryParam을 사용하여 쿼리에 입력하는 변수 유형을 정의합니다.
데이터베이스 쿼리로 너무 구체적으로 아프지 않으며 정수가 문자열로 평가되어 잘못된 결과 세트를 반환하기 전에 문제가 발생했습니다.
(추가 (메인) 보너스 -CFQueryParam은 항상 SQL 주입 공격에 대한 추가 보호에 좋습니다)
오류가 데이터 또는 입력에 있다고 가정합니다 (세션 시간이 설정/무효?).
사실, 나 절대 목격 a <cfquery>
결과는 DB 서버가 콘솔에서 알려주는 것과 다른 결과입니다. 너무 불가능할 정도로 가능성이 있다고 생각하지 않습니다.
다음 테스트 시나리오를 제안합니다.
<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>
완벽하게 기능하고 있었고 다른 곳을 봐야합니다.