2009-12-23 46 views
1

我試圖用更新查詢CFQUERY像下面CFQUERY問題具有複雜的更新語句

<cfquery name = "UpdateRecord" 
      dataSource = #DATASOURCE# 
      username = #DBUSER# 
      password = #DBPASSWORD# 
      result="updateResult" > 
     update table1 
set field1=(select field1 from table2 where field3='Some Value') 
where field4='someothervalue' 
    </cfquery> 
    <cfdump var="#UpdateResult#"> 

但是,當我執行該頁面,該頁面沒有加載,在狀態欄上,我可以看到它裝載了火長時間。

但如果我使用任何簡單的更新查詢像

update table1 set field1='abc' where field4='someothervalue' 

那麼它工作正常

可以在任何一個有想法如何我可以執行類似上面使用CFQUERY的查詢?

謝謝

回答

1

你嘗試PreserveSingleQuotes內包裝更新嗎?

<cfquery name = "UpdateRecord" 
     dataSource = #DATASOURCE# 
     username = #DBUSER# 
     password = #DBPASSWORD# 
     result="updateResult" > 
    #PreserveSingleQuotes(update table1 set field1=(select field1 from 
    table2 where Field3='Some Value') where field4='someothervalue')# 
</cfquery> 
+0

是..它曾與PreserveSingleQuotes,感謝 – CFUser 2009-12-23 05:22:09

+0

我同意jarofclay,現在,它的工作原理,下一步應該將其轉換爲使用cfqueryparam – kevink 2009-12-23 12:55:02

0

你確定你的subselect語句返回1行。這取決於您正在運行的RDMS,但我非常確定並非所有數據庫都支持此功能。我試着直接在數據庫上運行查詢,看它是否正確運行。

您可能能夠強制SQL通過將限制1您的查詢的末尾,或者如果你的數據庫不支持在聚合包裝字段1只返回1行。

SELECT MAX(field1) FROM table2 WHERE field3 = 'Some Value' 

注意:如果您的字符串值是來自用戶的參數,則應確保使用cfqueryparam來防止SQL注入。

+0

是的,我想德同stament上直接DB,它工作得很好那裏,但如果我使用CFQUERY它不工作。而我的選擇語句只給出一個輸出。我們可以在cfquery中使用paranthesis'(',')'嗎? – CFUser 2009-12-23 03:45:36

+0

你是哪裏在查詢中使用「(」「),」你貼?使用括號沒有任何問題。您的單引號可能是一個問題。當你不使用cfqueryparam CF需要幾個步驟來幫助保護您免受自己;)見我的答覆@jarofclay。 – Leigh 2009-12-23 17:11:28

2

如果您可以嘗試使用cfqueryparam作爲您的值,並且您不必使用PreserveSingleQuotes。它也可以防止SQL注入。

+1

+1。 CF會自動轉義引號來緩解sql注入風險。 PreserveSingleQuotes()解除了這種保護,並可以將數據庫暴露給sql注入。除非確實需要它,否則不要使用PreserveSingleQuotes(),並且您瞭解風險。另外,通過使用cfqueryparam,您可以從綁定變量中獲得一些性能優勢。 – Leigh 2009-12-23 17:01:41