【问题标题】:How to insert only one record in the database on multiple clicks on submit button如何在多次单击提交按钮时仅在数据库中插入一条记录
【发布时间】:2019-04-07 09:43:02
【问题描述】:

我正在使用 CodeIgniter。我有一个表单,字段是Name, Email, Mobile no, Message

我能够使用 AJAX 提交数据库中的数据。 AJAX 没有问题。

现在我做了什么,我填写表格并单击提交按钮两次,然后检查我的数据库,由于两次单击,我发现了两次相同的记录。如果我在提交按钮上单击 3 次,那么我会在数据库中获得 3 次相同的记录。

有什么办法可以阻止这个问题。就像一键应该在提交按钮上工作,直到数据提交到数据库中?

查看

<div class="i_p_aboutTeam_alert" id="popup_verify-1" style="display: none;">
  <div class="profile_content">
    <div class="profile_header clearfix">
         <a href="javascript:void(0);" class="close_popup " onclick="closePopup();"><i class="fas fa-times"></i></a>
      </div>
   <div class="profile_body">
      <div class="form_heading">
      <h2>CONTACT FORM</h2>
   </div>
      <form action="" method="post" name="form" id="form" autocomplete="off">
         <div class="form-group ffl-wrapper">
            <label for="name" class="ffl-label">Name</label>
            <input type="text" name="name" class="form-control" id="name">
         </div>

         <div class="form-group ffl-wrapper">
            <label for="mobileno" class="ffl-label">Mobile Number</label>
            <input type="text" name="mobileno" class="form-control" id="mobileno">
         </div>

         <div class="form-group ffl-wrapper">
            <label for="email" class="ffl-label">Email</label>
            <input type="email" name="email" class="form-control" id="email">

         </div>
           <div class="form-group ffl-wrapper">
            <label for="message" class="ffl-label">Message</label>
            <textarea class="form-control" name="message" id="message"></textarea>
         </div>
         <div class="form-group text-center">
         <input type="submit" name="send" class="i_btn i_btn_bg  i_btn_round w_100p" value="Submit">
      </div>
      </form>
   </div>

  </div>
</div>

AJAX

$("#form").validate({
  rules: {
    name: {
      required: true,
      minlength: 3,
      lettersonly: true
    },
    mobileno: {
      required: true,
      minlength: 10,
      maxlength: 10,
      number: true
    },
    email: {
      required: true,
      email: true
    },
    message: {
      required: true,
      minlength: 10
    }
  },
  submitHandler: function(form) {
    //form.submit();
    $.ajax({
      url: "<?php echo base_url('Home_control/contact');?>",
      type: "POST",
      data: $('#form').serialize(),
      success: function(data) {
        $("#popup_verify-1").hide();
        $("#popup_success-1").show();
      },
    }); // AJAX Get Jquery statment
  }
});

控制器

public function contact() {
  $this -> form_validation -> set_error_delimiters('<div class="error">', '</div>');

  $this -> form_validation -> set_rules('name', 'Name', 'trim|required|min_length[3]');
  $this -> form_validation -> set_rules('mobileno', 'Mobile no', 'trim|required|regex_match[/^[0-9]{10}$/]');
  $this -> form_validation -> set_rules('email', 'email', 'required|valid_email');
  $this -> form_validation -> set_rules('message', 'Message', 'required');

  if ($this -> form_validation -> run() == FALSE) {
    //$this->index();
  } else {
    $form_data = array(
      'name' => $this -> input -> post('name', TRUE),
      'mobileno' => $this -> input -> post('mobileno', TRUE),
      'email' => $this -> input -> post('email', TRUE),
      'message' => $this -> input -> post('message', TRUE)
      );
    $success = $this -> db -> insert('form', $form_data);
    echo json_encode(array("data" => $success)); // return to the ajax
  }

}

【问题讨论】:

  • 有两种方法。 1.第一次单击后禁用提交按钮 2.首先检查表中的现有数据如果存在则退出如果不插入。 stackoverflow.com/questions/35223752/…
  • @urfusion,我认为第一个选项是正确的方法。第二个选项对我不好,因为一段时间后,如果用户想要插入相同的记录,那么它不会接受,但我需要它。
  • 我必须使用代码 // $(this).find("input[type='submit']").prop('disabled',true);但是我必须在哪里使用此代码可以帮助我?

标签: php jquery ajax html codeigniter-3


【解决方案1】:

为正在进行的请求维护标志

<script type="text/javascript">
  var isReqInprogress = false;
  $("#form").validate({
  rules: {
    name: {
      required: true,
      minlength: 3,
      lettersonly: true
    },
    mobileno: {
      required: true,
      minlength: 10,
      maxlength: 10,
      number: true
    },
    email: {
      required: true,
      email: true
    },
    message: {
      required: true,
      minlength: 10
    }
  },
  submitHandler: function(form) {
    //form.submit();
    if(isReqInprogress){
      return;
    }
    isReqInprogress = true;
    $.ajax({
      url: "<?php echo base_url('Home_control/contact');?>",
      type: "POST",
      data: $('#form').serialize(),
      success: function(data) {
        $("#popup_verify-1").hide();
        $("#popup_success-1").show();
        isReqInprogress = false;
      },
    }); // AJAX Get Jquery statment
  }
});

</script>

【讨论】:

  • 给我时间检查
  • 您的代码正在运行。不用ajax你也能帮我吗?
【解决方案2】:

这是您可以使用的 AJAX 代码:

解决方案 1:如果要禁用提交按钮,请单击直到 AJAX 调用完成。

$.ajax({
    type: "POST",
    url: "<?php echo base_url('Home_control/contact');?>",
    data: $('#form').serialize(),
    beforeSend: function() { 
      $('#form').find("input[type='submit']").prop('disabled', true); // disable button
    },
    success:function(data){ 
      $("#popup_verify-1").hide();
      $("#popup_success-1").show();
      $('#form').find("input[type='submit']").prop('disabled', false); // enable button
    }
  });

解决方案 2:如果您不想禁用提交按钮,但要防止 AJAX 调用被多次使用。

$("#form").validate({
var isCurrentReqInprogress = false;
...
...

submitHandler: function(form) {
    //form.submit();
    if(isCurrentReqInprogress){
      return;
    }
    isCurrentReqInprogress = true;
    $.ajax({
      url: "<?php echo base_url('Home_control/contact');?>",
      type: "POST",
      data: $('#form').serialize(),
      success: function(data) {
        $("#popup_verify-1").hide();
        $("#popup_success-1").show();
        isCurrentReqInprogress = false;
      },
    }); // AJAX Get Jquery statment
  }
});

【讨论】:

  • 我尝试了您的代码,但无法正常工作。我的意思是禁用类不能在提交按钮上工作
  • 请尝试更新的解决方案或尝试提供一个 id(建议 submit_btn)提交按钮,然后使用$('#submit_btn').prop('disabled', false/true);
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2020-10-06
  • 2015-04-27
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多