2014-12-03 61 views
0
sel_prod_dt = "select distinct change_app_code, change_number " 
      & " \<cfif NDA_check eq " 
      &'"Y"' 
      &"> FROM db.tb tb" 
      &"\<cfelse\>FROM db.tb2 PC\<\/cfif\>" 

我碰到下面的錯誤評估與SELECT語句中的CFIF我如何在一個字符串

語法錯誤,期望像一個名稱或一個Unicode分隔單詞「change_number」和之間的標識請求結束。

任何人都可以請幫我在這方面..

+0

你想在數據庫或ColdFusion變量上使用if條件嗎? – 2014-12-03 11:41:44

+2

以供參考,以上是無效的cfml/cfscript代碼。在可能的情況下,您應該發佈一個[*自包含的* repro案例](http://www.sscce.org/)。另外,總是包含你的dbms類型和SQL問題。 – Leigh 2014-12-03 13:49:13

回答

2

爲什麼在複雜的事情?

<cfif NDA_check eq "Y"> 
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb tb" 
<cfelse> 
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb2 PC" 
</cfif> 
+0

可能是NDA_check是db中的列名。但我不確定。 – 2014-12-03 11:56:21

+0

那麼,那麼sql語句也是錯誤的;) – 2014-12-03 11:59:13

+0

其他人讀這個:因爲''必須嵌套在一個cfquery中,你不應該把查詢組裝成字符串。這根本不是正確的做事方式。雖然在不包含變量的查詢中幾乎無害,但風險仍然很小,並且沒有收益。奧索爾沒有冒犯性。 – 2014-12-04 07:23:20

6

一個不能添加CFML到一個字符串,他們以某種方式期望它運行!直到運行時纔會處理字符串,並且CFML代碼在運行之前需要進行編譯。

閱讀這應該澄清「The ColdFusion request/response process

所以你需要運行之前已經完成,語法正確CFML在文件

在您的問題中,您沒有提供足夠的細節來幫助您解決問題的實際代碼解決方案,但基本上@Ocssor可能是正確的。

+0

這看起來像一個數據庫錯誤消息。所以實際的代碼可能會編譯。但是,即使這樣做,cfml代碼也會在CF服務器上運行,而不是在數據庫中運行。所以在一個SQL字符串中嵌入cfml代碼*是沒有意義的。這可能是導致數據庫錯誤的原因。然而,沒有更多的細節,這只是一個猜測。正如亞當所說,你需要提供更多信息。 – Leigh 2014-12-03 13:41:47

+0

@Leigh哦,它是從數據庫中定義的,因爲字符串不是有效的SQL。因爲OP期望CFML執行*,所以不要留在字符串中。 – 2014-12-03 13:52:02

+0

Duh,我剛剛意識到我誤解了你評論的第一部分,這就是你的意思。我需要更多的咖啡因;-) – Leigh 2014-12-03 13:57:48

0

要在構建字符串時使用條件邏輯,請一次執行一個步驟。

sqlString = "select field1, field2 "; 
if (something) { 
sqlString &= ", field3"; 
} 
sqlString &= " rest of the query goes here"; 
2

動態組裝SQL查詢(轉換成字符串)往往是危險的,很少有必要(當它是,它的時間來重新考慮的事情,如果你仍然認爲這是再次考慮)。它也犧牲了使用重要標籤cfqueryparam的能力。

所以,你會做這樣的事

<cfquery...> 
    select distinct change_app_code, change_number 
    <cfif NDA_check eq '"Y"'>FROM db.tb tb 
    <cfelse>FROM db.tb2 PC</cfif> 
</cfquery> 

現在,這裏的使用三元Ifs的一個偉大的時刻,他們看起來更清潔了很多

(是NDA支票的價值確實應該是"Y"我不能告訴,更可能的是,它應該是Y。您可能需要更改。)

<cfquery...> 
    select distinct change_app_code, change_number 
    FROM #(NDA_check eq '"Y"' ? "db.tb tb" : "db.tb2 PC")# 
</cfquery> 

三元國際單項體育聯合會在字符串裏使用ke您正在嘗試:

<cfset myfavcolor = "green"> 
<cfset yourfavcolor "red"> 
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#"> 

但是,它們在非常簡單的If/else性質上運行。唯一的辦法是如果嵌套另一個Ternary,那麼它們對於其他ififs尤其不是很理想,特別是其他很多elseifs。

<cfset myfavcolor = "green"> 
<cfset yourfavcolor "red"> 
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : (yourfavcolor is not "purple" ? "different favorite colors" : "... I'm not talking to you, you like purple"))#"> 

爲了記錄,我覺得你沒有利用表格別名,這似乎很奇怪。從上面使用我的cfquery示例。

<cfquery...> 
    select distinct change_app_code, change_number 
    FROM #(NDA_check eq '"Y"' ? "db.tb" : "db.tb2")# theTB 
</cfquery> 

這樣,無論從哪個表中抽取,都可以引用該表(在查詢中)作爲TB。


現在,對於一些建議。

如果你覺得需要加載一個表名到一個變量名

select * from #thetable# 

確保範圍變量。如果它的東西,你的頁面設置,設置像這樣

<cfset variables.thetable = "mytable"> 

select * from #variables.thetable# 

但是,作爲一項規則,我落下一個變量到查詢走就走,如果我不能<cfqueryparam>而表名不能是<cfqueryparam>'d。

如果我絕對必須,我作用域的變量,因爲我證明,讓我知道源,因爲......

select * from #thetable# 

可能湊巧用的url.thetable或形式的源告終。該表對SQL注入來說是災難性的和開放的。


更多的建議,因爲你只是CF起步,你應該開始一個很好的(和極爲重要的)習慣現在<cfqueryparam>每#變量#你的查詢的where子句。它也應該用於插入或更新查詢中的每個用戶可配置變量。這樣做總是很重要的。 (不幸的是,你不能使用cfqueryparam一個動態表名)。

閱讀上cfqueryparam這裏:cfqueryparam

標籤可以看冗長的(並且是,我永遠也不會知道是什麼土坯的想法),但它是你對SQL Injection的第一道防線。

+0

這很可愛,但它並沒有真正解決實際問題。 – 2014-12-05 07:09:18