2017-03-13 1 views
1

Laravelには、ユーザーが登録できるAPIがあります。Laravel 5でユニークな検証を使用しているにもかかわらず、重複するフィールド

登録は、電子メールを一意にするための簡単な検証を持っており、このようなものになります。重複した電子メールと私のテーブルで

public function register(Request $request) { 
    $this->validate($request, [ 
     'email' => 'required|email|unique:users|max:255', 
     'password' => 'required|min:6|max:50', 
    ]); 

    // create new user and save model 
} 

残念ながら、私はまだ見つけかなりの数のユーザーを。

私のアプリは、同じリクエストを複数回連続して送信することがあると考えています。これは、データベースにまだ追加されていない電子メールと同じ電子メールを持っているにもかかわらず、両方の要求が検証に合格することを意味します。

電子メールの一意性を確実にするためにこの問題を解決するにはどうすればよいですか?

+0

どのように役立ちますDBの 'email'カラムに' UNIQUE'キーを使用することについては?次に、コード1062でSQLエラーが発生したかどうかを確認できます。このエラーは、重複エントリ)をに置き換えます。 –

+0

はい固有のキーを追加する予定でしたが、エラーを検出して処理できるようにしたかったのです。あなたが言われたようにエラーをどう処理することができますか? –

+0

実際にデータを挿入するときに 'try-catch block'を使うことができます: –

答えて

1

あなたが実際にデータを挿入するときtry-catch blockが(詳しくはPHP Manualを参照)を使用することができます。の場合はそうでないfalse

try { 
    $connection->query(<yourInsertquery>); 
    return true; 
} catch (PDOException $e){ 
    if ($e->getCode() == 1062){ 
    return 'duplicate'; 
    } 
    return false; 
} 

をこれであなたがエントリを重複している時はいつでも'duplicate'が返された文字列を取得しますtrue

-1

クライアント側の送信ボタンを無効にすることで同じフォームを複数回送信しないようにすることもできます...同時送信された2つのセッションから同じメールアドレスを取得することはほとんどありませんLY ...

$(document).ready(function() { 

     $('#button').click(function() { 
      $('#button').attr('disabled', true); 
      $('#Form').submit(); 
      return true; 
     }); 

    }); 

はフォームのためのトークンを生成し、唯一の提出に形成したセッションのロック...その猫を肌には多くの方法にそのトークンを保存することで、このサーバ側のような何かを行うことができます。前の回答は同様に動作しますが、あなたは、データベースへのラウンドトリップを必要とする(これはフリンジケースであると無視できるべきであるが...)...この1つはパフォーマンス上のペナルティを持っていない

希望これは

+0

残念ながら、既にリリースされているモバイルアプリです –

関連する問題