加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在CodeIgniter中重复插入数据

发布时间:2020-12-13 22:19:09 所属栏目:PHP教程 来源:网络整理
导读:我只是在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(
我只是在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的新手.请帮帮我.任何帮助将不胜感激.

解决方法

这是双重提交问题.

有几种方法可以解决它:

> The Post / Redirect / Get pattern:打破后退按钮,它不会让您的用户回到远远不能再次提交.不处理多次点击.
>禁用提交按钮:在某些时候处理多次点击,但不会修复用户返回并再次提交.
> Store a token in the session:如果您在浏览器中打开了多个选项卡,则会话中存储的令牌可能会混淆. (注意:有可能使用javascript来create browser tab specific cookies,但我自己没有尝试过.)
>将数据库更改为不允许重复:最佳解决方案,但也是最省力的.如果它检测到一组重复数据,请忽略第二个请求.
>唯一交易ID:在PHP hacks page和this answer上描述.
>会话中的多个令牌:选项3的变体.如果在会话中存储所有生成的令牌,则无需涉及数据库.考虑到令牌在会话中是唯一的,复制的概率要低得多.可能的问题包括令牌失控的一组令牌.也许可以使用有限大小的堆栈进行修复,您可以将其添加到堆栈的顶部,并且额外的令牌会从底部掉落.未经测试.

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

>生成一个随机的transaction_id并将其放入您的Web表单中.当用户点击提交时,它会继续.
>当您收到添加产品的请求时,请检查事务表中的transaction_id.
>如果表中不存在id,请执行该事务,并将transaction_id插入表中.
>如果表中存在id,则事务已完成.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读