F5 tuşuna basarak zaman php formu yeniden kaçınmak

6 Cevap php

Ben F5 vurduğunuzda bir formu yeniden göndermeyi deneyin ve önlemek için (php ve smarty kullanarak) siteme aşağıdaki kodu var:

if ($this->bln_added == false) {
    if (isset($_POST['submit'])) {
        $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']);
        $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']);
    }
} else {
    $this->obj_site->obj_smarty->assign('title', '');
    $this->obj_site->obj_smarty->assign('desc', '');
    unset($_POST);
}

bln_added false varsayılan, ancak forma kez true değişiklikleri başarıyla teslim edilir. Smarty değişkenler başlık ve azalan durumda orada form içeriğini bir kullanıcı hatası olduğunu tutmak için şablonda kullanılan ve girdikleri ne değiştirmeniz gerekir vardır.

Form başarıyla gönderilirse eğer doğruysa = bln_added ayarlar, böylece kod ikinci bit form alanlarını temizlemek değil, aynı zamanda boş $ _POST olmamalıdır. Ben F5 tuşuna basarsanız ama sonrası veri hala var.

Herhangi bir fikir?

6 Cevap

Sizin yöntem teoride işe yarayabilir, ancak çok daha kolay bir yolu var.

Başarıyla formu gönderdikten sonra, bir yönlendirme yapmak. Bu nereye önemli değil, ama $ 'POST temizlemek gerekir.

header('Location: http://www.example.com/form.php');

Eğer zaten konum sayfasına yönlendirmek istediğiniz gibi bir durumda, bu sesler. Eğer bir onay mesajı görüntülemek istiyorsanız URL bir $ _GET parametresini ekleyin.

Bu yardımcı olur umarım

Tom

Çözelti, yaygın olarak Post/Redirect/Get olarak bilinen bir kalıptır

Formları işlemek için en iyi yolu, kendini sunulması ve yönlendirme kullanmaktır. Böyle bir şey:

if (isset($_POST)) {
  // Perform your validation and whatever it is you wanted to do
  // Perform your redirect
}

// If we get here they didn't submit the form - display it to them.

Kullanarak CodeIgniter framework:

function index() {
  $this->load->library('validation');
  // Your validation rules

  if ($this->form_validation->run()) {
    // Perform your database changes via your model
    redirect('');
    return;
  }
  // The form didn't validate (or the user hasn't submitted)
  $this->load->view('yourview');
}

Ben tarafından (php) bu çözüldü:

  1. şeklinde zaman dayalı olmayan benzersiz bir tanımlayıcı (id + sayaç) add () (!)

  2. benzersiz bir tanımlayıcı ile bir oturum için kontrol ayrı bir dosyaya (postform.php) göndermek

  3. benzersiz bir tanımlayıcı ile oturum bulundu DEĞİLDİ eğer): veritabanına gönderebilir ve benzersiz bir tanımlayıcı ile oturum doldurun

    benzersiz bir tanımlayıcı ile oturum bulundu eğer b): hiçbir şey

  4. 3a/3b yönlendirme ya da başlık ile Sonuçlar sayfasına sonra ('Yer: http://mydomain.com/mypage')

Result is:
no resubmit actions on either refresh/backbutton and only resubmit warning on double click backbutton (but no resubmit action)

Sonrası başarılı bir eylem sonrası vuruşu konumu kullan

header('Location: '.$_SERVER['HTTP_REFERER']);

Sonrası gerekli, ancak yetersiz olduğunu sonra yönlendirme header.

PHP tarafında başarıyla formu gönderdikten sonra, bir yönlendirme yapmak. Örn. header ('Yer: http://www.example.com/form.php');

Ama bu yeterli değildir. Bazı kullanıcılar iki kez (DoubleClick) bağlantıları basın. Bir JavaScript ilk tıklandıktan sonra Gönder düğmesini devre dışı olacağı gereklidir.