【问题标题】:cfquery problem with complex update statements复杂更新语句的cfquery问题
【发布时间】:2010-12-29 08:38:06
【问题描述】:

我正在尝试使用 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 执行上述查询?

谢谢

【问题讨论】:

    标签: coldfusion cfquery


    【解决方案1】:

    您确定您的子选择语句返回 1 行。这取决于您正在运行的 RDMS,但我很确定并非所有数据库都支持此功能。我会先尝试直接在您的数据库上运行查询,看看它是否运行正确。

    您可以通过在查询末尾设置限制 1 来强制 sql 仅返回 1 行,或者如果您的数据库不支持将 field1 包装在聚合中。

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

    注意:如果您的字符串值是来自用户的参数,您应该确保使用 cfqueryparam 来防止 SQL 注入。

    【讨论】:

    • 是的,我在 Directly DB 上尝试了相同的语句,它在那里运行良好,但如果我使用 cfquery,它就无法运行。而我的 select 语句只给出一个输出。我们可以在cfquery中使用括号'(',')'吗?
    • 您在发布的查询中在哪里使用 '(',')'?使用括号并没有错。您的单引号可能有问题。当您不使用 cfqueryparam 时,CF 会采取一些步骤来帮助您保护自己;)请参阅我对 @jarofclay 的回复。
    【解决方案2】:

    您是否尝试将更新包含在 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> 
    

    【讨论】:

    • 我同意 jarofclay,现在它可以工作了,下一步应该是将其转换为使用 cfqueryparam
    【解决方案3】:

    如果您可以尝试使用 cfqueryparam 作为您的值,并且您不必使用 PreserveSingleQuotes。它还可以防止 SQL 注入。

    【讨论】:

    • +1 。 CF 自动转义引号以减轻 sql 注入风险。 PreserveSingleQuotes() 消除了这种保护,并且可以将数据库暴露给 sql 注入。不要使用 PreserveSingleQuotes() 除非确实需要并且您了解风险。此外,使用 cfqueryparam,您可以从绑定变量中获得一些性能优势。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2011-02-22
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多