Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Verifique se a linha existe no banco de dados antes de inserir


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