Ověření unikátnosti ukládaných dat
Jak řešíte ukládání dat s ověřením unikátnosti záznamu?
Řešení první
Prvním řešením je zeptat se
$values = array('title' => "Test", 'slug' => "test", 'text' => "Lorem ipsum...");
if ($model->where("slug = ?", $values['slug'])->count("*") < 1) {
$model->insert($values);
} else {
/* $form['slug']->addError("..."); */
}
Problém
- mezi ověřením a uložením mohlo dojít k uložení článku se slugem “test” někým jiným
Řešení druhé
Druhým možným řešením je zachycení vyjímky při selhání
try {
$model->insert(array('title' => "Test", 'slug' => "test", 'text' => "Lorem ipsum..."));
} catch (\PDOException $e) {
$info = $e->errorInfo;
if ($info[0] == 23000 && $info[1] == 19) {
/* $form['slug']->addError("..."); */
} else {
throw $e;
}
}
Problémy
- kód 19 vrací SQLite v MySQL je to 1062, u jiné DB to zase bude jinak
- napsat ověření pro všechny DB kód rapidně prodlouží
- nestačí ověřovat chybový kód, ale musí se ověřovat i typ DB (v databázi A může chybový kód 19 znamenat něco jíného, než v databázi B)
- v Doctrine 2 se vám tímto uzavře EntityManager