【问题标题】:Catching exceptions for "INSERT … ON DUPLICATE KEY UPDATE" workaround in ZF在 ZF 中捕获“INSERT ... ON DUPLICATE KEY UPDATE”解决方法的异常
【发布时间】:2011-06-29 19:37:11
【问题描述】:

ZF 1.9.5 在这里。有人建议在使用 Zend_Db_Table 时捕获异常以模拟 ON DUPLICATE KEY UPDATE

目前,我正在接受

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'i7dd30253497cfc0539d7c5830a926f7d' for key 'ukey'

..使用时

$orderRow = $this->createRow();
$orderRow->ukey = $ukey;
$orderRow->save();

所以,我想用try / catch 抓住那个混蛋。例外 update ,否则 insert
但我不知道该抓什么。 Zend_Db_Exception? PDOException? Zend_Db_Adapter_Exception?我试了好几个,但我不认为我明白了。


稍后编辑。 这对我有用:

        try {
            $orderRow = $this->createRow();
            $orderRow->ukey = $ukey;
            $orderRow->$stepCol = time();
            $orderRow->save();
        } catch (Zend_Db_Statement_Exception $e) {
            // on UNIQUE error, update
            if ($e->getCode() == 23000) {
                $orderRow = $this->fetchRow($this->select()->where('ukey = ?', $ukey));
                $orderRow->$stepCol = time();
                $orderRow->save();
            }
        }

【问题讨论】:

  • 如果代码不是 2300,您可能应该重新抛出异常,以免错过其他类型的错误

标签: mysql zend-framework exception-handling mysql-error-1062


【解决方案1】:

看看抛出了什么异常:

try {
    // query
} catch (Exception $e) {
    var_dump(get_class($e));
}

这应该告诉您需要捕获哪种异常,因为“异常”将捕获每种类型的异常,无论是 ZF 异常还是 PDO 异常或完全不同的异常

【讨论】:

  • Zend_Db_Statement_Exception。感谢您的提示。
【解决方案2】:

它会抛出一个Zend_Db_Statement_Exception

关于抛出什么异常,你可以看看edorian's answer

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2013-10-03
    • 2022-11-03
    • 2015-07-30
    • 2011-01-29
    • 1970-01-01
    • 2017-04-24
    • 2011-08-09
    相关资源
    最近更新 更多