Détection des exceptions pour la solution de contournement « INSÉRER… SUR MISE À JOUR DE CLÉ EN DUPLICATE » dans ZF
-
15-11-2019 - |
Question
ZF 1.9.5
ici.Quelqu'un a suggéré d'attraper des exceptions pour émuler ON DUPLICATE KEY UPDATE
lors de l'utilisation de Zend_Db_Table.
Actuellement, je reçois
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'i7dd30253497cfc0539d7c5830a926f7d' for key 'ukey'
..lors de l'utilisation
$orderRow = $this->createRow();
$orderRow->ukey = $ukey;
$orderRow->save();
Alors, je veux attraper ce connard avec try / catch
.À titre exceptionnel update
, autre insert
.
Mais je ne sais pas quoi attraper. Zend_Db_Exception
? PDOException
? Zend_Db_Adapter_Exception
?J'en ai essayé plusieurs, mais je ne pense pas y être parvenu.
Modifier plus tard.Cela a fonctionné pour moi :
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();
}
}
La solution
Regardez quelle exception est levée comme ceci :
try {
// query
} catch (Exception $e) {
var_dump(get_class($e));
}
Cela devrait vous indiquer quel type d'exception vous devez intercepter, car "Exception" interceptera tous les types d'exception, qu'il s'agisse d'une exception ZF, d'une exception PDO ou de quelque chose de complètement différent.
Autres conseils
Il lancera un Zend_Db_Statement_Exception
.
Pour savoir quelle exception est levée, vous pouvez jeter un œil à La réponse d'Edorian.