Mysql
 sql >> Database >  >> RDS >> Mysql

Verificare se la riga esiste nel database prima dell'inserimento

È 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>";