Zend_Db_Table:插入导致错误时会发生什么?

时间:2009-04-17 05:25:54

标签: database zend-framework error-handling exception-handling

这可能是一个容易回答的问题,但我没有在文档中看到它......

插入导致错误时会发生什么?抛出异常?什么类型?我试图了解尝试在唯一的列中插入重复数据时会发生什么。

所以我觉得我需要先做一些检查......

protected function _emailAlreadySubscribed($email)
{
    $select = $this->_model->select()->where('email = ?', $email);
    $rows = $table->fetchAll($select);
    if ($rows->count()) {
        return true;
    }
    return false;
}

这是检查的正确方法吗?

3 个答案:

答案 0 :(得分:3)

不,检查电子邮件是否已存在是有效的解决方案。其他人可以在您检查后但INSERT之前插入重复值。唯一的解决方案是锁定整个表。

当您违反Zend_Db_Table::insert()中的唯一键时,会抛出Zend_Db_Statement_Exception(或其子类)。

另见MySQL Insert: Test first?

答案 1 :(得分:2)

我一直在玩Zend Framework来尝试检测数据库异常并处理它们。不幸的是,一旦你发现异常,getCode()方法似乎总是返回'0',所以我最终使用以下代码检查重复:

try { 
    $model->insert($data);
    $added++; 
} catch (Zend_Db_Exception $e) {
    if(strstr($e->getMessage(), '1062 Duplicate')) {
        // duplicate
        $duplicates++;
    } else {
        // general error
        $errors++;
    }
}

不是我所知道的最优雅的代码,所以如果有人知道如何更好地处理这些异常或者有异常代码参考,请填写!

答案 2 :(得分:0)

对于插入,我确保我的db表具有正确的索引(在这种情况下,是emailAddress上的唯一索引),然后我将插入包装在try / catch块中。

我让DB告诉我它是否是一个骗局而不是先检查。

Insert会在数据库失败时抛出异常。然后,您可以使用异常检查数据库失败的原因,并向您的用户显示相应的消息。