这可能是一个容易回答的问题,但我没有在文档中看到它......
插入导致错误时会发生什么?抛出异常?什么类型?我试图了解尝试在唯一的列中插入重复数据时会发生什么。
所以我觉得我需要先做一些检查......
protected function _emailAlreadySubscribed($email)
{
$select = $this->_model->select()->where('email = ?', $email);
$rows = $table->fetchAll($select);
if ($rows->count()) {
return true;
}
return false;
}
这是检查的正确方法吗?
答案 0 :(得分:3)
不,检查电子邮件是否已存在不是有效的解决方案。其他人可以在您检查后但INSERT
之前插入重复值。唯一的解决方案是锁定整个表。
当您违反Zend_Db_Table::insert()
中的唯一键时,会抛出Zend_Db_Statement_Exception
(或其子类)。
答案 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会在数据库失败时抛出异常。然后,您可以使用异常检查数据库失败的原因,并向您的用户显示相应的消息。