По-добре е да зададете ограничение на колоните си, за да предотвратите дублиране на данни, вместо да проверявате и вмъквате.
Просто задайте УНИКАЛНО ограничение за imdbid
:
ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);
Причината да направите това е, за да не се натъкнете на състояние на състезанието .
Между завършването на проверката и действителното вмъкване на данните има малък прозорец и в този малък прозорец могат да бъдат вмъкнати данни, които ще противоречат на данните, които предстои да бъдат вмъкнати.
Решение? Използвайте ограничения и проверете $DBH->error()
за грешки при вмъкване. Ако има някакви грешки, знаете, че има дубликат и тогава можете да уведомите потребителя си.
Забелязах, че използвате това, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. В този случай не е необходимо да проверявате ->error()
защото PDO ще хвърли изключение. Просто обвийте изпълнението си с try and catch по следния начин:
$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>";