2012-06-25 129 views
0

我得到「複雜對象類型無法轉換爲簡單值。」locationId和/或operatorId通過url發送,始終是一個簡單數字('304 「)。下面是查詢代碼:獲取Coldfusion複雜對象錯誤但沒有複雜對象

select * 
from table1, table2 
where table1.u_construct_id(+)=table2.u_construct_id 
and table1.LOCATION_ID = #locationId# 
and table1.OPERATOR_ID = #operatorId# 
+9

您是否轉儲了值以查看它們包含的值? ''此外,代碼並不會限制變量的可能性(小),因爲您實際上得到了錯誤的變量,即同名的不同範圍。 (與往常一樣,真正的查詢應該在所有參數上使用cfqueryparam。) – Leigh

+0

哪個變量出錯?請按照Leigh所說的範圍來確定變量的範圍。 – Busches

+0

正如其他人所說:發佈完整的實際錯誤消息。如果您打開了強大的異常處理功能,它會告訴您確切的錯誤行,正如您所建議的那樣 - 可能不是您上面引用的那部分代碼。也做一些你自己的疑難解答...轉儲出錯的代碼附近的變量,並驗證它們包含你認爲它們包含的內容。 –

回答

8

什麼錯誤的詳細信息?它是專門指向查詢還是僅僅指向查詢附近的行之一,這會導致您假設查詢出錯。

(沒有什麼到目前爲止,你已經張貼什麼說,這是一個查詢的問題。)

在任何情況下,你的查詢是目前容易受到SQL注入,並應改爲如下:

select * 
from table1, table2 
where table1.u_construct_id (+)= table2.u_construct_id 
and table1.LOCATION_ID = <cfqueryparam value="#url.locationId#" cfsqltype="cf_sql_integer" /> 
and table1.OPERATOR_ID = <cfqueryparam value="#url.operatorId#" cfsqltype="cf_sql_integer" /> 

注意,以及cfqueryparam(其通常應該在所有的動態變量使用,但特別是客戶端提供的那些),這兩個變量已經url作用域,並且它可能是,正確地確定範圍中的變量是修正(如果locationId或operatorId存在於其他作用域中,則作爲非簡單變量)。

-3

感謝您的所有幫助,但答案竟然是operatorId不得不重新命名。不知道爲什麼這會起作用,但懷疑CF將此視爲保留字詞。

+3

聽起來很有可能您有另一個變量名爲'operatorId',它覆蓋了這個變量 - 解決方案是_NOT_重命名該變量,解決方案是正確地確定變量的範圍(多次指出)。 –

+0

好的,你能指點我一個解釋範圍變量的簡單教程嗎?我以爲我在代碼中的其他地方;未顯示。但也許我不應該理解範圍。 – user1481133

+1

文檔始終是一個開始的好地方:http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7fd5.html –