вставка дубликатов данных в CodeIgniter - PullRequest
3 голосов
/ 17 ноября 2011

Я просто вставляю данные в часть контроллера codeigniter на pastebin http://pastebin.com/KBtqrAkZ

  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. Помоги мне, пожалуйста. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

19 голосов
/ 17 ноября 2011

Это проблема Double Submit .

Существует несколько способов решения этой проблемы:

  1. Публикация / перенаправление / получение шаблона : ломает кнопку «Назад», и это не мешает вашему пользователю вернуться назад достаточно далеко для повторной отправки.Не обрабатывает несколько кликов.

  2. Отключить кнопку отправки : обрабатывает несколько кликов в течение некоторого времени, но не исправляет возвращение пользователя и повторную отправку.

  3. Сохранить токен в сеансе : если в браузере открыто несколько вкладок, токен, сохраненный в сеансе, может запутаться,(Примечание: может быть возможно создать файлы cookie для конкретной вкладки браузера с использованием javascript, но я сам не пробовал.)

  4. Изменить базу данных нане разрешать дубликаты : лучшее решение, но также и максимальное усилие.Если он обнаруживает набор повторяющихся данных, проигнорируйте второй запрос.

  5. Уникальный идентификатор транзакции : описан на этой странице PHP-хаков , ина этот ответ .

  6. Несколько токенов в сеансе : вариант варианта 3. Если вы сохраняете все сгенерированные токены в сеансе,вам не нужно привлекать базу данных.Вероятность дублирования намного ниже, учитывая, что токены являются уникальными внутри сеанса.Возможные проблемы включают набор токенов, выходящих из-под контроля.Может быть исправлено с помощью стека ограниченного размера, где вы добавляете к вершине стека, и дополнительные токены падают с дна.Не проверено.

-

Мне нравится метод уникальный идентификатор транзакции .Это работает так:

  1. Создайте случайное число transaction_id и поместите его в веб-форму.Это происходит, когда пользователь нажимает submit.

  2. Когда вы получаете запрос на добавление продукта, проверяет на transaction_id в таблице транзакций.

  3. Если идентификатор не существует в таблице, выполните транзакцию и вставьте идентификатор транзакции в таблицу.

  4. Если идентификатор существует в таблице , транзакция уже выполнена.

Вам также необходимо выполнить поиск [двойная защита от отправки] , чтобы узнать, сможете ли вы найти еще лучшее решение.

2 голосов
/ 17 ноября 2011

Это простое решение, вы можете перенаправить на другую страницу после добавления продукта, например:

redirect(base_url(). "yourcontrollername/index");

При этом будут удалены данные публикации, и данные не будут повторно добавлены в базу данных.

...