Catching exceptions for "INSERT … ON DUPLICATE KEY UPDATE" workaround in ZF

5.5k Views Asked by At

ZF 1.9.5 here. Someone suggested catching exceptions to emulate ON DUPLICATE KEY UPDATE when using Zend_Db_Table.

Currently, I'm getting

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

..when using

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

So, I want to catch that bugger with try / catch. On exception update , else insert.
But I don't know what to catch. Zend_Db_Exception? PDOException? Zend_Db_Adapter_Exception? I've tried several, but I don't think I got it.


Later edit. This worked for me:

        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();
            }
        }
2

There are 2 best solutions below

1
On BEST ANSWER

Just look what exception is getting thrown like this:

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

That should tell you what kind of exception you need to catch because "Exception" will catch every type of exception, be it a ZF exception or a PDO exception or something completely different

0
On

It will throw a Zend_Db_Statement_Exception.

Regarding finding out what Exception is thrown, you could take a look at edorian's answer.