È meglio impostare un vincolo sulle colonne per evitare la duplicazione dei dati invece di controllare e inserire.
Basta impostare un vincolo UNICO su imdbid
:
ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);
Il motivo per farlo è che non ti imbatti in una condizione di gara .
C'è una piccola finestra tra il completamento del controllo e l'inserimento effettivo dei dati, e in quella piccola finestra potrebbero essere inseriti dati che andranno in conflitto con i dati da inserire.
Soluzione? Usa i vincoli e controlla $DBH->error()
per errori di inserimento. Se ci sono errori, sai che c'è un duplicato e puoi avvisare il tuo utente.
Ho notato che stai usando questo, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
. In questo caso, non è necessario selezionare ->error()
perché PDO genererà un'eccezione. Avvolgi la tua esecuzione con try and catch in questo modo:
$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>";