3

私はpastebinhttp://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');  
  }

私のモデルパーツよりも、pastebinhttp://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. データベースを変更して重複を許可しない: 最善の解決策ですが、最も手間がかかります。一連の重複データが検出された場合は、2 番目の要求を無視します。

  5. 一意のトランザクション ID : このPHP ハック ページこの回答で説明されています。

  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

簡単な解決策があります。製品を追加した後、次のような他のページにリダイレクトできます。

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

これを行うと、投稿データが削除され、データがデータベースに再追加されなくなります。

于 2011-11-17T10:28:03.353 に答える