sql >> Base de Datos >  >> RDS >> Mysql

Compruebe si existe una fila en la base de datos antes de insertar

Es mejor establecer una restricción en sus columnas para evitar datos duplicados en lugar de verificar e insertar.

Simplemente establezca una restricción ÚNICA en imdbid :

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

La razón para hacer esto es para que no te encuentres con una condición de carrera .

Hay una pequeña ventana entre la finalización de la verificación y la inserción real de los datos, y en esa pequeña ventana, se pueden insertar datos que entrarán en conflicto con los datos que se insertarán.

¿Solución? Use restricciones y marque $DBH->error() por errores de inserción. Si hay algún error, sabe que hay un duplicado y puede notificar a su usuario entonces.

Noté que estás usando esto, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); . En este caso, no necesita marcar ->error() porque PDO lanzará una excepción. Simplemente ajuste su ejecución con try and catch así:

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