Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Prüfen Sie vor dem Einfügen, ob die Zeile in der Datenbank vorhanden ist

Es ist besser, eine Einschränkung für Ihre Spalten festzulegen, um doppelte Daten zu vermeiden, anstatt sie zu überprüfen und einzufügen.

Setzen Sie einfach eine UNIQUE-Einschränkung für imdbid :

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

Der Grund dafür ist, dass Sie nicht in eine Race Condition geraten .

Es gibt ein kleines Fenster zwischen dem Abschluss der Prüfung und dem tatsächlichen Einfügen der Daten, und in diesem kleinen Fenster könnten Daten eingefügt werden, die mit den einzufügenden Daten in Konflikt stehen.

Lösung? Verwenden Sie Einschränkungen und überprüfen Sie $DBH->error() für Einsetzfehler. Wenn es Fehler gibt, wissen Sie, dass es ein Duplikat gibt, und können Ihren Benutzer dann benachrichtigen.

Ich habe bemerkt, dass Sie dies verwenden, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); . In diesem Fall müssen Sie ->error() nicht prüfen weil PDO eine Ausnahme auslöst. Verpacken Sie Ihre Ausführung einfach mit try and catch wie folgt:

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