1

これはおそらく簡単な質問ですが、ドキュメントに記載されているとは限りません。Zend_Db_Table:挿入時にエラーが発生したらどうなりますか?

エラーが発生したらどうなりますか?例外がスローされますか?どんなタイプ?ユニークな列に重複データを挿入しようとしたときに何が起こるのかを理解しようとしています。

だから私はいくつかが最初にチェックを行う必要があるように私は感じて...

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

はこれがチェックするための正しい方法ですか?

答えて

3

いいえ、既に電子メールが存在するかどうかを確認することは、ではなく、有効な解決策です。他の人があなたのチェックの後で、あなたのINSERTの前に重複した値を挿入することができます。唯一の解決策は、テーブル全体をロックすることです。

Zend_Db_Table::insert()の一意のキーに違反すると、Zend_Db_Statement_Exception(またはそのサブクラス)がスローされます。

は、挿入のためにもMySQL Insert: Test first?

+1

2人のユーザーがメールの列が一意の同じテーブルに数ミリ秒以内に同じメールを挿入する確率はどれくらいですか?私はあなたの意見を見ますが、isUniqueバリデーターを使ってうまくやっていて、有効なアプローチだと思います。説明したケースが発生した場合(p = .00000000001?)、エラーが表示されます。 – markus

+0

2つの考えの後で、100%確実なやり方ができるのであれば、99%の確実なやり方をするのはばかげているかもしれないと認めなければならないかもしれません...しかし、私はまだこのような違反が起きたことを疑う電子メール。 – markus

+0

エントリが重複しているために例外がスローされたことを伝える方法がありますか?何か不明なエラーがありますか? – Andrew

0

を参照してください。私は私のdbテーブルが適切なインデックス(EMAILADDRESSにこの場合は、一意のインデックス)を持っていることを確認した後、私はtry/catchブロック内の私のインサートを包みます。

最初にチェックするのではなく、デュープであるかどうかをDBに教えさせてもらいます。

データベースに障害が発生すると、挿入によって例外がスローされます。例外を使用してデータベースが失敗した理由を確認し、適切なメッセージをユーザーに表示することができます。

2

私は、DB例外を検出して処理するためにZend Frameworkを試してきました。あなたは、例外をキャッチしたら、残念ながらにgetCode()メソッドは常に「0」を返すように見えるので、私は重複をチェックするために、次のコードを使用して終了:

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

私は知らない最も優雅なコードを、だから、誰かがこれらの例外をよりうまく処理する方法を知っていたり、例外コードリファレンスを持っていたら、チップインしてください!

関連する問題