Lepiej ustawić ograniczenie na kolumny, aby zapobiec duplikowaniu danych, zamiast sprawdzania i wstawiania.
Po prostu ustaw UNIKALNE ograniczenie dla imdbid
:
ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);
Powodem tego jest to, że nie wpadniesz w warunek wyścigu .
Pomiędzy zakończeniem sprawdzania a faktycznym wstawieniem danych jest małe okno, w którym mogą zostać wstawione dane, które będą kolidować z danymi, które mają zostać wstawione.
Rozwiązanie? Użyj ograniczeń i sprawdź $DBH->error()
za błędy wstawiania. Jeśli są jakieś błędy, wiesz, że istnieje duplikat i możesz wtedy powiadomić swojego użytkownika.
Zauważyłem, że używasz tego, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. W takim przypadku nie musisz sprawdzać ->error()
ponieważ PDO zgłosi wyjątek. Po prostu zawiń swoje wykonanie, spróbuj i złap w ten sposób:
$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>";