【问题标题】:Duplicate fields despite using unique validation in Laravel 5尽管在 Laravel 5 中使用了唯一验证,但重复的字段
【发布时间】:2017-08-03 09:33:51
【问题描述】:

在 Laravel 中,我有一个允许用户注册的 API。

注册有一个简单的验证电子邮件是唯一的,看起来像这样:

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
}

不幸的是,我仍然在我的表中发现不少用户的电子邮件重复。

我认为这是因为我的应用有时会快速连续多次发送相同的请求。这意味着两个请求都通过了验证,尽管它们具有相同的电子邮件,因为它们尚未添加到数据库中。

如何解决此问题以确保电子邮件的唯一性?

【问题讨论】:

  • 在您的数据库中为您的email 列使用UNIQUE 键怎么样?然后,您可以检查您是否收到代码 1062 的 SQL 错误,这表示错误 Duplicate Entry <value> for key <xyz> in <abc>
  • 是的,我计划添加一个唯一键,但我希望能够检测和处理错误。我该如何处理你提到的错误。
  • 实际插入数据时可以使用try-catch block
  • 但这只会检查任何异常。如何检测该特定异常。
  • 更新方法验证呢?

标签: php mysql laravel laravel-5 laravel-validation


【解决方案1】:

在您的输入验证中使用此自定义函数,如此示例

   $validator = Validator::make(Input::all(), [

            'name' => 'required',
            'email' => [
                'required',
                'email',
                    function ($attribute, $value, $fail) {
                        if (Employee::where('email',$value)->count() > 0) {
                            $fail($attribute.'already exits');
                        }
                    },
            ],
        ]);

【讨论】:

    【解决方案2】:

    您可以在实际插入数据时使用try-catch block(有关更多信息,请参阅PHP Manual):

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

    有了这个,只要你有重复的条目,你就会得到一个字符串'duplicate',否则false如果出现不同的错误,true

    【讨论】:

      【解决方案3】:

      或者只是通过禁用客户端的提交按钮来防止多次提交同一个表单...您不太可能从同时提交的两个会话中获得相同的电子邮件地址...

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

      您可以通过为表单生成一个令牌并将该令牌保存到会话中来执行类似此服务器端的操作,该会话将该表单锁定为仅一次提交......为这只猫换肤的多种方法。上一个答案也可以,但是您需要往返于数据库...这个没有性能损失(尽管这是一种边缘情况,应该可以忽略不计...)

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-24
        • 2020-07-07
        • 2020-08-02
        • 1970-01-01
        • 2016-05-31
        • 2016-03-18
        • 2018-08-09
        • 1970-01-01
        相关资源
        最近更新 更多