3

我只是在 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的新手。请帮帮我。任何帮助将不胜感激。

4

2 回答 2

19

这是双重提交问题

有几种处理方法:

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

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

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

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

  5. 唯一交易 ID:在此PHP hacks 页面此答案中进行了描述。

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

--

我喜欢独特的交易ID方法。它是这样工作的:

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

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

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

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

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

于 2011-11-17T10:58:59.433 回答
2

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

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

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

于 2011-11-17T10:28:03.353 回答