CodeIgniter中的重复数据插入

ARI*_*ANA 3 php duplicate-data codeigniter double-submit-prevention

我只是在pastebin http://pastebin.com/KBtqrAkZ的 codeigniter控制器部分插入数据

  public function add_product()
  {
    $this->lang->load('log_in', 'english');
        log_in_check($this->lang->line('log_in_authentication_error'), 'admin/log_in');
        $this->lang->load('common', 'english');
        $data['title'] = $this->lang->line('admin_index_title');
        $this->load->view('admin_template/header', $data);
        $this->load->view('admin_template/left_menu');
    $data['error_msg'] = '';
        if ($this->form_validation->run('add_product') === TRUE)
        {
      $this->admin_model->add_product($this->input->post());
            $this->session->set_flashdata('status_msg', $this->lang->line('add_product_success'));
            redirect(uri_string(), 'refresh');
      exit ;
          $data['error_msg'] = $this->lang->line('add_product_invalid_data');
        }
        $this->load->view('admin/add_product');
        //$this->load->view('admin_template/notification');
        $this->load->view('admin_template/footer');  
  }
Run Code Online (Sandbox Code Playgroud)

比我的模型部分简单添加在pastebin http://pastebin.com/WiLHV2sr

  public function add_product($data = array())
  {
    $this->db->insert('ishop_product', $data);
    return $this->db->insert_id();
  }
Run Code Online (Sandbox Code Playgroud)

如果我按ctrl + F5或F5而不是数据插入,我的问题是重定向后.我是codeigniter的新手.请帮帮我.任何帮助将不胜感激.

Gus*_*ram 19

这是双重提交问题.

有几种方法可以解决它:

  1. 发布/重定向/获取模式:打破后退按钮,它不会让您的用户回到远远不能再次提交.不处理多次点击.

  2. 禁用提交按钮:某些时候处理多次点击,但不会修复用户返回并再次提交.

  3. 在会话中存储令牌:如果您在浏览器中打开了多个选项卡,则会话中存储的令牌可能会混淆.(注意:可以使用javascript创建特定浏览器选项卡的cookie,但我自己没有尝试过.)

  4. 将数据库更改为不允许重复:最佳解决方案,但也是最省力的.如果它检测到一组重复数据,请忽略第二个请求.

  5. 唯一的交易ID:在这个PHP黑客页面上描述,并在这个答案.

  6. 会话中的多个令牌:选项3的变体.如果在会话中存储所有生成的令牌,则无需涉及数据库.考虑到令牌在会话中是唯一的,复制的概率要低得多.可能的问题包括令牌失控的一组令牌.也许可以使用有限大小的堆栈进行修复,您可以将其添加到堆栈的顶部,并且额外的令牌会从底部掉落.未经测试.

-

我喜欢唯一的事务id方法.它的工作原理如下:

  1. 生成一个随机的transaction_id并将其放入您的Web表单中.它在用户点击时发生submit.

  2. 当您收到添加产品的要求,检查transaction_id在事务表.

  3. 如果表中不存在 id ,请执行该事务,并将transaction_id插入表中.

  4. 如果表中存在 id ,则事务已完成.

您还应该搜索[double-submit-prevention],看看是否能找到更好的解决方案.

  • 这可能实际上是*最好的PHP相关答案,特别标记为[double-submit-prevention](http://stackoverflow.com/questions/tagged/double-submit-prevention),只是因为它的广泛性(并且相当少)带标签的问题).就个人而言,我从不喜欢PRG逐字,如维基百科所述.例如,书签或发送链接到"成功"页面似乎是错误的. (2认同)