PHP Uygulama hiçbir yeniden-sonrası garanti

3 Cevap php

Ben bu zaten ele edilmiş ise, bu cevap almak için çok doğru yazılan bana gelin lütfen aramak için ne bilinen olmayabilir.

Şimdi, biraz özel bir CMS var ve ben kullanıcıların sayfayı yenileyerek kendi $ _POST verileri yeniden sunamayan sağlamak istiyoruz. Yani böyle bir şey yaptık:

<?
  //Start a session to hold variables I want after my redirect
  session_start();
  if($_POST){ 

    //Do some php stuff and if I'm happy with the results...
    $_SESSION['some_vars'] = $whatever;

    //Bring me back here but without the $_POST data
    header('Location: '.THIS_PAGE);
    exit;

  }
?>

Komut dosyası yeniden yükler benim oturum değişkenleri kullanmak ve oturumu çöp.

Herkes bu işlemek için daha iyi bir yol olup olmadığını merak ediyorum. Bu adil olmayan hantal ama ben her zaman daha fazla verimlilik için arıyorum.

Teşekkürler.

EDIT: arada, ne yapıyorum belirsiz görünüyor eğer bir soru göndermek zaman stackoverflow.com şekilde yapar, ama onlar bunu yaparken onlar da bir permalink yapmak.

3 Cevap

Aslında Post-Redirect-Get pattern denir hayata geçirdik ve kesinlikle bunu yapmak için doğru bir yoldur. Ben kendimi bu yapmak. Ben sık sık kullanmak, ben genelde beni kullanmak yardım etmek benim temel denetleyicisi sınıflara bazı küçük yardımcı işlevleri uygulamak:

public function prgRedirect($url = null, $sessionData = null)
{
    if ($sessionData !== null) {
        if (! isset($_SESSION)) session_start();
        $_SESSION['_PRG'] = $sessionData;
    }
    if ($url === null) $url = $_SERVER['HTTP_REFERER'];
    header("Location: ".$url);
}

public function getPrgData()
{
    if (! isset($_SESSION)) session_start();
    if (isset($_SESSION['_PRG'])) {
        $data = $_SESSION['_PRG'];
        unset($_SESSION['_PRG']);
    }
    else {
        $data = null;
    }
    return $data;
}

Ben genellikle REST tarzı URL'ler ile kullanabilirsiniz, böylece bir POST isteği daha sonra aynı kaynak / sayfa geri GET url yönlendirir ki, bunu yapmak için var ne yapmak prgRedirect() kullanarak oturumu için bazı verileri kaydetmek olacaktır . GET yöntemi için işleyici yürütmenin üstünde getPrgData() aramak ve oturum veri şey olmadığını göreceksiniz.

çok önemli bu kullanıcı aynı veri eklemek vermezsek senin veritabanında bazı benzersiz bir sütun olması gerekir (belki başlık gibi?) eminim. Bu başlık zaten var eğer öyleyse sadece kontrol edin. herhangi bir alışkanlık oturumları bu şekilde kullanmanız gerekir

Iki sorun burada aslında vardır:

  • veriler zaten kaydedilmiş ve verileri kaydeder bir sayfa olan zaman tarayıcıda refresh düğmesine basarak kullanıcılar
  • kullanıcı tarayıcıda "Geri" düğmesini vurur ve yine renkli "Gönder" tıklar.

Birinci senaryoda, en iyi düzeni kullanıcıyı yönlendirmek için header("location:somewhere_else.php") çağrı kullanmak GET-sonra-POST desen takip etmektir. Bu şekilde (sunucu 302 başlığını dönmüştü çünkü) verileri yayınlanmıştır sayfa, tarayıcınızın geçmiş listesinde olmadığı için, arka arkaya iki kez aradım olma konusunda endişelenmenize gerek yok.

POST GET-sonra-yardımcı olmuyor çünkü ikinci senaryo, biraz daha acıyor. Kullanıcı iki formu gönderdiğinde, iki kez veri kaydedebilirsiniz. Bu durumda, çeşitli çözümler olabilir:

  • Eğer müşteri göndermek her formda bir "biçim tanımlayıcı" (rastgele bir dize) koymak. Müşteri formu gönderdiğinde zaten oturum verilerine böyle tanımlayıcı varsa, kontrol edin. Eğer yoksa, form verilerini kaydetmek ve "zaten kullanılmış" gibi kullanıcının oturumunda tanımlayıcı hatırlıyorum. Session veri tanımlayıcı bulursanız, kaydetmek şey yok - bu bir yinelenen bulunuyor.
  • teslim tam olarak aynı değerler için veritabanı kontrol. Eğer uyarsa, bir kopyasını kaydedin. Ancak, kullanıcı, "Geri" düğmesini tıklayan verilerin bazı parça değiştirdi ve daha sonra formu yeniden teslim olabilir.