Je lepší nastavit omezení na sloupce, abyste zabránili duplicitním datům namísto kontroly a vkládání.
Stačí nastavit UNIKÁTNÍ omezení na imdbid
:
ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);
Důvodem je, abyste nenarazili na závodní podmínky .
Mezi dokončením kontroly a skutečným vložením dat je malé okénko a do tohoto malého okna by mohla být vložena data, která budou v konfliktu s daty, která mají být vložena.
Řešení? Použijte omezení a zkontrolujte $DBH->error()
pro chyby vkládání. Pokud se vyskytnou nějaké chyby, víte, že existuje duplikát, a můžete o tom uživatele informovat.
Všiml jsem si, že používáte toto, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. V tomto případě nemusíte kontrolovat ->error()
protože PDO vyvolá výjimku. Stačí zabalit popravu pokusem a chytit takto:
$duplicate = false;
try {
$STH->execute();
} catch (Exception $e) {
echo "<p>Failed to Request ".$_POST['imdbid']."!</p>";
$duplicate = true;
}
if (!$duplicate)
echo "<p>Successfully Requested ".$_POST['imdbid']."! Thanks!</p>";