Перехват исключений для обходного пути «INSERT… ON DUPLICATE KEY UPDATE» в ZF

StackOverflow https://stackoverflow.com/questions/5041534

Вопрос

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.

Что касается выяснения того, какое исключение выброшено, вы можете взглянуть на ответ Эдориана.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top