1

Dies ist wahrscheinlich eine einfache Frage zu beantworten, aber ich sehe es nicht in der Dokumentation erwähnt ...Zend_Db_Table: Was passiert, wenn der Einsatz zu einem Fehler führt?

Was passiert, wenn Einfügen einen Fehler verursacht? Wird eine Ausnahme ausgelöst? Welche Art? Ich versuche zu verstehen, was passieren würde, wenn doppelte Daten in eine Spalte eingefügt werden, die eindeutig ist.

So fühle ich mich wie ich zuerst einige Kontrollen tun müssen ...

protected function _emailAlreadySubscribed($email) 
{ 
    $select = $this->_model->select()->where('email = ?', $email); 
    $rows = $table->fetchAll($select); 
    if ($rows->count()) { 
     return true; 
    } 
    return false; 
} 

Ist dies der richtige Weg, um zu überprüfen?

Antwort

3

Nein, prüfen, ob die E-Mail bereits existiert ist nicht eine gültige Lösung. Eine andere Person könnte nach Ihrer Überprüfung einen doppelten Wert einfügen, jedoch vor Ihrer INSERT. Die einzige Lösung besteht darin, die gesamte Tabelle zu sperren. Wenn Sie einen eindeutigen Schlüssel in Zend_Db_Table::insert() verletzen, wird Zend_Db_Statement_Exception (oder eine Unterklasse davon) ausgelöst.

Siehe MySQL Insert: Test first?

+1

Wie hoch ist die Wahrscheinlichkeit, dass zwei Benutzer dieselbe E-Mail innerhalb weniger Millisekunden in dieselbe Tabelle einfügen, in der die E-Mail-Spalte eindeutig ist? Ich sehe Ihren Standpunkt, aber ich denke, die Verwendung eines isUnique-Validators macht den Job gut und ist ein gültiger Ansatz. Wenn der von Ihnen beschriebene Fall eintritt (p = .00000000001?), Erhalten Sie einen Fehler, und? – markus

+0

Nach ein paar Gedanken muss ich zugeben, dass es vielleicht dumm ist, es zu 99% sicher zu machen, wenn man es genauso gut 100% sicher machen kann ... aber ich bezweifle immer noch, dass so ein Verstoß jemals passiert ist E-Mails. – markus

+0

gibt es eine Möglichkeit zu sagen, dass die Ausnahme ausgelöst wurde, weil der Eintrag ein Duplikat ist, im Gegensatz zu einem unbekannten Fehler? – Andrew

0

auch für Einsätze, ich sicherstellen, dass ich wickle in einem try/catch-Block meinen Einsatz geeignete Indizes (in diesem Fall ein eindeutiger Index auf emailaddress) und dann nur meine db-Tabelle.

Ich lasse die DB mir sagen, ob es ein Dupe ist, anstatt zuerst zu prüfen.

Insert löst beim Fehlschlagen der Datenbank Ausnahmen aus. Sie können dann überprüfen, warum die Datenbank mit der Ausnahme fehlgeschlagen ist, und Ihrem Benutzer die entsprechende Nachricht anzeigen.

2

Ich habe mit Zend Framework herum gespielt, um zu versuchen, DB-Ausnahmen zu entdecken und sie zu behandeln. Leider, wenn Sie die Ausnahme gefangen haben, immer die getCode() Methode ‚0‘ zurückzukehren scheint, so landete ich nach Duplikaten mit dem folgenden Code bis zu überprüfen:

try { 
    $model->insert($data); 
    $added++; 
} catch (Zend_Db_Exception $e) { 
    if(strstr($e->getMessage(), '1062 Duplicate')) { 
     // duplicate 
     $duplicates++; 
    } else { 
     // general error 
     $errors++; 
    } 
} 

Nicht der anmutigsten Code, den ich kenne, Wenn jemand weiß, wie man mit diesen Ausnahmen besser umgeht oder einen Ausnahmecode hat, bitte rein!

Verwandte Themen