it-swarm.com.de

Drupal 7 db_insert () execute () Fehler, wenn die Tabelle eindeutige Schlüssel enthält

Ich habe eine Datenbanktabelle (MySQL), die einen eindeutigen Schlüssel in der Spalte barcode enthält.

Was ich beabsichtige, ist Folgendes:

  • Ich habe ein Formular mit einem barcode Feld.
  • Wenn der Benutzer das Formular abschickt und der eingegebene Barcode bereits in der Datenbanktabelle vorhanden ist, sollte ich nur eine Fehlermeldung geben.
  • Derzeit gibt es mir PDOException: ... Duplicate entry Und der Seiteninhalt wird nicht geladen.

So habe ich die Einfügung gemacht:

$insert = db_insert('mymodule_mytable')->fields($fieldarray)->execute();

In dieser Zeile gibt Drupal 7 einen PDO-Fehler zurück, sodass ich die Zeilen danach nicht ausführen kann. Daher kann ich auch den Rückgabewert in $insert Nicht überprüfen.

Gibt es eine Problemumgehung, um den PDO-Fehler zu vermeiden? Ich muss so etwas tun wie:

if($insert === FALSE) {
  drupal_set_message(t('Error'), 'error');
}
4
Neigyl R. Noval

PHP hat Ausnahmebehandlung in Form von try...catch Blöcke:

try {
  $insert = db_insert('mymodule_mytable')->fields($fieldarray)->execute();
}
catch (PDOException $e) {
  drupal_set_message(t('Error: %message', array('%message' => $e->getMessage())), 'error');
}

Anstatt den Fehler vollständig zu ignorieren, können Sie tatsächlich auf verschiedene Arten von Ausnahmen reagieren und entsprechend reagieren.

6
Clive

Ich bin mir nicht sicher, ob man sich hier auf die Ausnahmebehandlung verlassen sollte, wie die akzeptierte Antwort nahelegt. Anstatt ein try...catch block, ein besserer Ansatz könnte darin bestehen, explizit zu überprüfen, ob der Datensatz mit der ID bereits vorhanden ist, bevor er eingefügt wird:

if (db_query("SELECT 1 FROM {mymodule_mytable} WHERE mid = :mid", array(':mid' => $mid))->fetchField()) {
  drupal_set_message(t('ID already exists!'), 'error');
}
else {
  // Perform the insertion.
}

Edit : Wie von kiamlaluno in den Kommentaren erwähnt, besteht der zusätzliche Vorteil dieses Ansatzes darin, dass die Überprüfung auf eine doppelte ID separat im Handler für die Formularvalidierung erfolgen kann, in dem die Benutzereingaben überprüft werden sollen.

2
jamix