【问题标题】:How to use bind variables with Zend_Db_Table->update() in the where clause如何在 where 子句中使用 Zend_Db_Table->update() 绑定变量
【发布时间】:2009-10-23 06:01:41
【问题描述】:

如果我想使用Zend_Db_Table->update() 方法用数据更新我的表,我无论如何都找不到在“where”子句中使用绑定变量。

方法签名是:

int  update($data, array|string $where)

通常你会这样调用方法:

$table = new Bugs();

$data = array(
    'updated_on'      => '2007-03-23',
    'bug_status'      => 'FIXED'
);

$where = $table->getAdapter()->quoteInto('bug_id = ?', 1234);

$table->update($data, $where);

quoteInto 只是要转义变量,而不是绑定它。

需要有一种方法来使用绑定变量,否则 DBMS 不会有效地缓存这个查询。

是我遗漏了什么,还是 Zend 的疏忽?

【问题讨论】:

    标签: zend-framework zend-db-table


    【解决方案1】:

    您只是在更新数据,RDBMS(我假设是 MySQL)不会缓存 UPDATE 查询。如果您仍想使用绑定变量(安全性?性能?),则必须使用准备好的语句:

    $db = Zend_Db_Table_Abstract::getDefaultAdapter();
    $stmt = $db->prepare("UPDATE table SET key = :key, value = :value");
    
    foreach ($data as $key=>$value) {
        $stmt->bindParam('key', $key);
        $stmt->bindParam('value', $value);
        $stmt->execute();
    }
    

    但除非您批量处理数百万个 UPDATE 查询,否则我认为您不应该为此烦恼。只需使用 $table->update($data, $where);

    【讨论】:

    • 谢谢。我在内部公司应用程序中使用 Oracle。你是对的,性能本身不是问题——我问这个问题是因为我喜欢尽可能遵循最佳实践。所以我可以按照你的建议重写我的代码,或者接受 Zend_Db_Table 的这个限制。这令人失望,因为只有 WHERE 子句未绑定 - SET 子句在后台使用绑定变量。您可能会认为它们会提供一种在查询的所有部分中使用绑定变量的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2012-11-17
    • 1970-01-01
    • 2022-11-18
    • 2011-06-25
    • 2020-04-16
    相关资源
    最近更新 更多