2009-12-23 125 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