Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vérifiez si la ligne existe dans la base de données avant d'insérer

Il est préférable de définir une contrainte sur vos colonnes pour éviter les données en double au lieu de vérifier et d'insérer.

Définissez simplement une contrainte UNIQUE sur imdbid :

ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);

La raison de le faire est de ne pas vous heurter à une condition de course .

Il y a une petite fenêtre entre la fin de la vérification et l'insertion des données, et dans cette petite fenêtre, des données pourraient être insérées qui entreront en conflit avec les données à insérer.

Solution? Utilisez des contraintes et vérifiez $DBH->error() pour les erreurs d'insertion. S'il y a des erreurs, vous savez qu'il y a un doublon et vous pouvez alors en informer votre utilisateur.

J'ai remarqué que vous utilisez ceci, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); . Dans ce cas, vous n'avez pas besoin de vérifier ->error() car PDO lèvera une exception. Enveloppez simplement votre exécution avec try and catch comme ceci :

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