Перехват исключений для обходного пути «INSERT… ON DUPLICATE KEY UPDATE» в ZF
-
15-11-2019 - |
Вопрос
ZF 1.9.5
здесь.Кто-то предложил перехватывать исключения для эмуляции ON DUPLICATE KEY UPDATE
при использовании Zend_Db_Table.
В настоящее время я получаю
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();
}
}
Решение
Просто посмотрите, какое исключение выдается следующим образом:
try {
// query
} catch (Exception $e) {
var_dump(get_class($e));
}
Это должно сказать вам, какой тип исключения вам нужно перехватить, потому что «Исключение» будет перехватывать все типы исключений, будь то исключение ZF, исключение PDO или что-то совершенно другое.
Другие советы
Это бросит Zend_Db_Statement_Exception
.
Что касается выяснения того, какое исключение выброшено, вы можете взглянуть на ответ Эдориана.