【问题标题】:duplicate data insert in CodeIgniter在 CodeIgniter 中插入重复数据
【发布时间】:2011-12-31 04:33:20
【问题描述】:

我只是在 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');  
  }

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

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

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

【问题讨论】:

标签: php codeigniter duplicate-data double-submit-prevention


【解决方案1】:

这是双重提交问题

有几种处理方法:

  1. The Post / Redirect / Get pattern:打破后退按钮,它不会阻止您的用户返回足够远的地方再次提交。不处理多次点击。

  2. 禁用提交按钮:有时会处理多次点击,但不会修复用户返回并再次提交的问题。

  3. Store a token in the session:如果您在浏览器中打开了多个选项卡,则会话中存储的令牌可能会混淆。 (注:使用javascript可能create browser tab specific cookies,但我自己没有尝试过。)

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

  5. 唯一事务 ID:在此 PHP hacks pagethis answer 上进行了描述。

  6. 会话中的多个令牌:选项 3 的变体。如果将所有生成的令牌存储在会话中,则无需涉及数据库。鉴于令牌在会话中是唯一的,重复的可能性要低得多。可能的问题包括令牌集失去控制。也许可以通过有限大小的堆栈来修复,您可以在堆栈顶部添加额外的令牌,然后从底部掉落。未经测试。

--

我喜欢唯一的交易ID方法。它的工作原理是这样的:

  1. 生成一个随机的transaction_id 并将其放入您的网络表单中。当用户点击submit时,它会继续。

  2. 当您收到添加产品的请求时,检查事务表中的transaction_id

  3. 如果id在表中不存在,进行事务,将transaction_id插入表中。

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

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

【讨论】:

  • 这实际上可能最好的PHP相关答案,专门标记double-submit-prevention只是因为它的广泛性(并且标签的问题很少)。就个人而言,我从不喜欢 Wikipedia 上描述的逐字记录 PRG。例如,能够为“成功”页面添加书签或发送链接似乎是错误的。
  • 当未来的读者来到这里时,可能会有更好的解决方案。比如说,会话中有多个令牌。其实……这可能行得通。嗯。
【解决方案2】:

有一个简单的解决方案,您可以在添加产品后重定向到其他页面,例如:

重定向(base_url()。“您的控制器名称/索引”);

这样做会删除帖子数据,并且数据不会重新添加到数据库中。

【讨论】:

  • 我已将 redirect(uri_string(), 'refresh'); 更改为 redirect(uri_string()); 并已解决我本可以采用您的答案,但未优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2016-10-21
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多