É melhor definir uma restrição em suas colunas para evitar dados duplicados em vez de verificar e inserir.
Basta definir uma restrição UNIQUE em
imdbid
:ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);
A razão para fazer isso é para que você não encontre uma condição de corrida .
Há uma pequena janela entre terminar a verificação e realmente inserir os dados e, nessa pequena janela, podem ser inseridos dados que entrarão em conflito com os dados a serem inseridos.
Solução? Use restrições e verifique
$DBH->error()
para erros de inserção. Se houver algum erro, você saberá que há uma duplicata e poderá notificar seu usuário. Percebi que você está usando isso,
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. Neste caso, você não precisa verificar ->error()
porque o PDO lançará uma exceção. Apenas envolva seu execute com try e catch assim:$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>";