Sayfa yenilendiğinde formun yeniden gönderilmesi nasıl engellenir (F5 / CTRL + R)


132

Metni SQL tabloma gönderen basit bir formum var. Sorun şu ki, kullanıcı metni gönderdikten sonra sayfayı yenileyebiliyor ve veriler formu tekrar doldurmadan tekrar gönderiliyor. Metin gönderildikten sonra kullanıcıyı başka bir sayfaya yönlendirebilirim, ancak kullanıcıların aynı sayfada kalmasını istiyorum.

Her kullanıcıya benzersiz bir oturum kimliği vermek ve bunu yaşadığım sorunu çözen başka bir değerle karşılaştırmakla ilgili bir şeyler okuduğumu hatırlıyorum ama nerede olduğunu unuttum.



1
Kullanıcıyı neden başka bir sayfaya yönlendirmek istemiyorsunuz?
Adam

@Adam: Çünkü bu, sunucuya başka bir istekte bulunmanın fazlalığı ve bu da yine DB'den bazı verileri alacaktır. Ancak bu kaynak israfıdır çünkü POSTtalebi işlerken gerekli tüm verileri zaten alıyoruz
Eugen Konkov

@EugenKonkov PRG modelinde, sadece başarı mesajı gösteren bir sayfaya yönlendirirsiniz. DB'den daha fazla getirmeye gerek yok.
Adam

@Adam: POSTVerilerin oluşturduğu tüm kaydı da görüntüleyebilirsiniz . Bu durumda SELECTDB'den almanız gerekir . Örneğin, faturayı oluşturduğunuzda, /invoices/53yalnızca 'başarılı' yerine tüm faturayı görüntülemeye yönlendirilirsiniz
Eugen Konkov

Yanıtlar:


96

Gönder / Yeniden Yönlendir / Al modelini kullanın. http://en.wikipedia.org/wiki/Post/Redirect/Get

Web sitemle, bir çerez veya oturumda bir mesaj saklayacağım, gönderiden sonra yeniden yönlendireceğim, çerezi / oturumu okuyacağım ve ardından bu oturumun veya çerez değişkeninin değerini temizleyeceğim.


1
Bu, işin yalnızca bir gönderi gerektirdiği durumlarda kromu geliştirme için kullanılamaz hale getirir!
John Peters

26
PRG kalıbını kullanırsanız, aslında sayfadan doğru çıkmış olursunuz? Soru, yönlendirme yapılmadığında işlerin nasıl çalıştırılacağı değil miydi?
Adam

1
Bana öyle geliyor ki, aynı sayfaya yeniden yönlendirirseniz, $ _POST silinir. Anladığım kadarıyla, istenen etki buydu. Zaten bu benim istediğim etkiydi. Yine de bunu açık hale getirirse cevabın daha iyi olacağını düşünüyorum.
donutguy640

İyi çalışıyor, tek önerim, katı hata testlerini etkinleştirdiğinizden emin olmaktır, böylece geliştirme sırasında yerel olarak hataları yakalayabilirsiniz, aksi takdirde fark edilmeyebilirler.
Maurice

Soruyu cevaplamıyor. Neden kabul edilen cevap olduğundan emin değilim.
YungGun

124

window.history.replaceStateYenileme ve geri düğmesiyle yeniden göndermeyi önlemek için bir javascript yaklaşımı kullanabileceğinizi de belirtmek isterim .

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

Kavram kanıtı burada: https://dtbaker.net/files/prevent-post-resubmit.php

Yine de Post / Redirect / Get yaklaşımını tavsiye ederim, ancak bu yeni bir JS çözümü.


1
Teşekkürler @dtbaker, bu harika :)
Gufran Hasan

1
Tks, bu benim için mükemmel bir iş, kullanıcının yanlış anlamasını önlemek için 404 sayfası oluşturması gerekiyordu
tess hsu

Tek kelimeyle muhteşem. Teşekkür ederim
user4906240

2
safaride çalışmıyor, href değiştirdi ancak yine de gönderilmek üzere gönderi isteği ile verileri
Vo Thanh Tung

Bu benim için çalıştı, teşekkürler! PRG yaklaşımını neden tavsiye ediyorsunuz?
iJassar

16

Bunu işlemek için gerçekten bir Yeniden Yönlendirme Sonrası Alma kalıbı kullanmalısınız, ancak bir şekilde PRG'nin uygun olmadığı bir konuma geldiyseniz (örneğin, formun kendisi bir dahil etme, yönlendirmeleri önleme) istek parametrelerinden bazılarını karma haline getirebilirsiniz. İçeriğe göre bir dize oluşturun ve daha sonra henüz göndermediğinizi kontrol edin.

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

Paylaştığın için teşekkürler ama bu işe yaramıyor. Sayfayı yenilemek gerçekten de formu benim için yeniden gönderiyor. Belki bir şeyi kaçırıyorum?
aLearner

Sayfayı yenilemek her şeyi yeniden gönderecektir, ancak yalnızca son gönderilen verilerden farklıysa (var 'messageIdent' oturumunda sakladığımız) gönderim verilerini işlemeyi seçiyoruz. Form gönderiminizi 'if messageIdents is different' cümlesi içinde mi işliyorsunuz (yani 'do_your_thang ()' nerede)?
Moob

Cevabın için teşekkürler. Sonunda Post / Redirect / Get modelini uygulamaya başladım, bu yüzden beni tam olarak neyin tetiklediğini şimdi hatırlamıyorum. Yine de geri döndüğün için teşekkürler.
aLearner

Bu yöntem, yeniden gönderimi engellemek değil ... yeniden gönderimi Algılamak içindir, böylece kodunuzu yeni bir gönderim olsaydı ne yaparsanız yapın "yapmamak" için değiştirebilirsiniz. Başka bir deyişle: Bu yöntemle "orijinal" gönderimi tespit edebilir ve verilerinizi yerleştirebilirsiniz. Orijinal DEĞİL ise, verilerinizi yerleştirmeyin. Ya bir "kopya girişimi" uyarısı gösterin veya bunun yerine belki bir "onay" gösterin.
TheSatinKnight

Bunun çalışması session_start();için dosyanın başına ekleyerek bir oturum başlatmış olmanız gerekir . w3schools.com/php/php_sessions.asp diyor ki Not: session_start () işlevi belgenizdeki ilk şey olmalıdır. Herhangi bir HTML etiketinden önce.
wkille

16

Bu javascript satırını, form gönderildikten sonra yenileme sırasında formun yeniden gönderilmesini isteyen açılır pencereyi engellemek için kullanıyorum.

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

Bu satırı dosyanızın alt kısmına yerleştirin ve sihri görün


Bunun istemci tarafından devre dışı bırakılamayan bir versiyonu güzel olurdu, ancak kısa, kolay, hızlı ... ve yapması gerekeni yapın. Geçmişi, kullanıcının gönderiyi yeniden göndermeden geri gidebilmesi için tutar.
Péter Vértényi

16

Bir oturum değişkeni aracılığıyla formun yeniden gönderilmesini engelleyebilirsiniz.

Önce rand()bir metin kutusunda ve $_SESSION['rand']form sayfasında ayarlamanız gerekir:

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

Bundan sonra, aşağıdaki gibi bir $_SESSION['rand']metin kutusu $_POST['randcheck']değeri ile kontrol edin :

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

3
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />onun yerine kullanabiliriz
Nikolay Bronskiy

Evet, rand () yerine mikrotime () ve time () kullanabiliriz, farklı bir değer veren fonksiyon veya değişken ne olursa olsun kullanabiliriz. AMA bu değeri SESSION değişkenine ayarladığınızdan emin olun. burada OTURUM, randcheck alanı ile kontrol etmek ve formun yeniden gönderilmesini önlemek için gereklidir.
Savoo

Oturum değişkeninin ve sonradan değişkenlerin eşleşip eşleşmediğini kontrol ettikten sonra oturum değişkeni temizlenmemeli mi?
denoise

1
@denoise @Savoo'nun fikrinin $_POST, form verilerinden sonra aynı sayfanın oturum ve post değişkenlerini yeniden ayarlayarak yeniden yüklediğine inanıyorum . Ayrıca değişkenlerin oluşturulması, değişkenlerin eşleşip eşleşmediğini kontrol ettikten sonra yapılmalıdır. Bu nedenle unsetgerekli değildir.
Hmerman6006

13

Form işlendiğinde başka bir sayfaya yönlendiriyorsunuz:

... process complete....
header('Location: thankyou.php');

aynı sayfaya yeniden yönlendirebilirsiniz.

yorum gibi bir şey yapıyorsanız ve kullanıcının aynı sayfada kalmasını istiyorsanız, form gönderimini Ajax ile halledebilirsiniz.


12

Bir sonraki çözümü buldum. Nesneyi işleyerek POSTisteği işledikten sonra yeniden yönlendirmeden kaçabilirsiniz history.

Yani HTML formunuz var:

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

Bu formu sunucunuzda işlediğinizde /the/result/page, Locationbaşlığı aşağıdaki gibi ayarlayarak kullanıcıyı yönlendirmek yerine :

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

görüntü açıklamasını buraya girin

POSTDüzenlenmiş verileri işledikten sonra küçük işlersiniz <script>ve sonuç/the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

<script>Eğer bir şekilde oluşturulması gerekir:

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

Sonuç:

görüntü açıklamasını buraya girin

Gördüğünüz gibi form verilerini edilir POSTiçin ed process.phpsenaryo.
Bu komut dosyası, verileri işler POSTve /the/result/pageaynı anda oluşturmayı şunlarla işler :

  1. yönlendirme yok
  2. POSTSayfayı yenilediğinizde yeniden veri yok (F5)
  3. POSTtarayıcı geçmişinde önceki / sonraki sayfaya gittiğinizde tekrar yok

UPD

Başka bir çözüm olarak ben sormak özellik isteği Mozilla FireFox kurulumu için kullanıcılara izin vermek ekip NextPagegibi çalışacak başlığındaki Locationbaşlık ve makyaj post/redirect/getmodası desen.

Kısacası. Sunucu form POSTverilerini başarıyla işlediğinde :

  1. Kurulum NextPagebaşlığı yerineLocation
  2. POSTForm verilerinin işlenmesinin sonucunu kalıpta GETistek için işleneceği şekilde post/redirect/getişleyin

NextPageÜstbilgiyi gördüğünüzde tarayıcı sırayla :

  1. Ayarlama window.locationile NextPagedeğerine
  2. Kullanıcı sayfayı yenilediğinde, tarayıcı yeniden form verileri yerine GETistek için pazarlık yaparNextPagePOST

Bence bu uygulanırsa mükemmel olur, değil mi? =)


11
  1. Üstbilgi kullanın ve sayfayı yeniden yönlendirin.

    header("Location:your_page.php"); Aynı sayfaya veya farklı bir sayfaya yönlendirebilirsiniz.

  2. $ _POST'u Veritabanına ekledikten sonra ayarı kaldırın.

    unset($_POST);


54
$ _POST ayarının kaldırılması, en azından Chrome'da formun yeniden gönderilmesini hiç etkilemez.
Gavin

2
Çalışmayacak. Kullanıcı arka sayfaya döndüğünde POST değişkenlerinin kurulumunu bir kez daha gerçekleştirir.
Sandhu

Kullanmanın nedeni nedir unset? Lütfen cevabınıza başkalarının da öğrenebileceği bir açıklama ekleyin
Nico Haase

7

Oldukça kesin bir yol, gönderiye benzersiz bir kimlik uygulamak ve

<input type='hidden' name='post_id' value='".createPassword(64)."'>

Sonra kodunuzda şunu yapın:

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

Aslında buna benzer bir şey yazdım, ancak parola oluşturma zahmetine girmedim, sadece formlarımı sıraladım (örneğin: 1-5 arası adımlar), yani eşitlerse devam edebiliriz, aksi takdirde db'ye kaydetmeyin veya e-posta göndermeyin. Ancak kullanıcının onu götürdüğü yere inmesine izin verin.
Fernando Silva

1
Bence bu, sayfayı yeniden yüklemekten daha iyi bir çözüm, çünkü başarılı bir gönderi yayınladığımda bir mesaj gösteriyorum ve sayfayı yeniden yüklemek mesajı silecektir. bu benim için grate çalışıyor, ayrıca bir
uniqid

7

Bu yöntem benim için iyi çalışıyor ve bence bu işi yapmak için en basit olanı bu.

Genel fikir, form gönderildikten sonra kullanıcıyı başka sayfalara yönlendirmektir, bu da sayfa yenilendiğinde formun yeniden gönderilmesini durdurur. Yine de, form gönderildikten sonra kullanıcıyı aynı sayfada tutmanız gerekiyorsa, bunu birden çok yolla yapabilirsiniz, ancak burada javascript yöntemini açıklıyorum.

Javascript Yöntemi

Bu yöntem oldukça kolaydır ve form gönderildikten sonra yenileme sırasında formun yeniden gönderilmesini isteyen açılır pencereyi engeller. Bu javascript kodu satırını dosyanızın altbilgisine yerleştirin ve sihri görün.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>


Bu da bana yardımcı oluyor
Ankit

4

JavaScript

Bu yöntem oldukça kolaydır ve form gönderildikten sonra yenileme sırasında formun yeniden gönderilmesini isteyen açılır pencereyi engeller. Bu javascript kodu satırını dosyanızın altbilgisine yerleştirin ve sihri görün.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

3

Form verilerini kullandıktan sonra sadece aynı sayfaya yönlendirin ve çalışır. Ben denedim

header('location:yourpage.php');

4
Bu sadece bir başkasının yıllar önce verdiği aynı cevabı tekrar ediyor. (Aslında iki kişi daha!)
Nick Rice

Başkalarının cevaplarını kopyalarsanız, en azından cevabınızı ilginç hale getirmek için bir açıklama eklemelisiniz
Nico Haase

3

Moob'un gönderisinin rafine bir versiyonu. POST'un bir karmasını oluşturun, bir oturum çerezi olarak kaydedin ve her oturumda karmaları karşılaştırın.

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

2

Temel olarak, o sayfadan yeniden yönlendirmeniz gerekir, ancak internetiniz yavaşken yine de sorun yaratabilir (Başlığı sunucu kenarından yeniden yönlendirin)

Temel senaryo örneği:

Gönder düğmesine iki kez tıklayın

Çözmenin yolu

  • İstemci tarafı

    • İstemci tıkladığında gönder düğmesini devre dışı bırakın
    • Jquery kullanıyorsanız: Jquery.one
    • PRG Deseni
  • Sunucu tarafı

    • İstek gönderildiğinde farklılaştırmaya dayalı karma zaman damgası / zaman damgası kullanma.
    • Userequest jetonları. Ana yük yüklendiğinde, tekrarlanırsa yok sayılacak geçici bir istek tocken atayın.

2

Yönlendirme olmadan php formunun yeniden gönderilmesi nasıl engellenir. $ _SESSION (session_start'tan sonra) ve $ _POST formu kullanıyorsanız, bunun gibi bir şey yapabilirsiniz:

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

HTML formunuza şunu yazın:

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

Bu nedenle, form her gönderildiğinde yeni bir eylem oluşturulur, oturumda saklanır ve eylem sonrası ile karşılaştırılır.

Not: Bir Al formu kullanıyorsanız, tüm POST'u GET ile kolayca değiştirebilirsiniz ve bu da çalışır.


1

Veritabanına ekledikten sonra, verileri temizlemek için unset () yöntemini çağırın.

unset ($ _ POST);

Yenileme verilerinin eklenmesini önlemek için, kayıt eklendikten sonra aynı sayfaya veya farklı sayfaya bir sayfa yeniden yönlendirmesi yapın.

başlık ( 'Yer:' $ _ SERVER [ 'PHP_SELF'].);


1
Lütfen cevabınıza başkalarının öğrenebileceği bir açıklama ekleyin - bu unsetçağrı neden gerekli? Atlarsan ne olur?
Nico Haase

0

Post / Redirect / Get kalıbını Keverw yanıtından kullanmak iyi bir fikirdir. Bununla birlikte, sayfanızda kalamazsınız (ve bence istediğiniz bu muydu?) Ek olarak, bazen başarısız olabilir :

Bir web kullanıcısı, sunucu gecikmesi nedeniyle ilk gönderim tamamlanmadan önce yenilenirse, belirli kullanıcı aracılarında yinelenen bir HTTP POST isteğiyle sonuçlanır.

SQL veritabanınıza aşağıdaki gibi metin yazılması gerekiyorsa başka bir seçenek de bir oturumda saklamak olacaktır:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0

Başkalarının da söylediği gibi, post / redirect / get kullanımından çıkmak mümkün değildir. Fakat aynı zamanda sunucu tarafında yapmak istediğinizi yapmak oldukça kolaydır.

POST sayfanızda, kullanıcı girişini doğrularsınız ancak üzerinde işlem yapmazsınız, bunun yerine onu bir SESSION dizisine kopyalarsınız. Daha sonra tekrar ana gönderim sayfasına yönlendirirsiniz. Ana gönderim sayfanız, kullandığınız SESSION dizisinin var olup olmadığını kontrol ederek başlar ve eğer öyleyse, yerel bir diziye kopyalayıp ayarını kaldırır. Oradan hareket edebilirsiniz.

Bu şekilde, tüm ana işinizi yalnızca bir kez yaparsınız ve yapmak istediğinizi başarırsınız.


0

Sonrasında büyük bir projede yeniden gönderimi engellemek için çözüm aradım. Kod $ _GET ve $ _POST ile oldukça iyi çalışıyor ve öngörülemeyen hatalar riski olmadan form öğelerinin davranışını değiştiremiyorum. İşte kodum:

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

Yalnızca $ _GET'in değil, $ _POST'un yeniden gönderilmesini önlemek için çalışır. Ama ihtiyacım olan davranış bu. Yeniden gönderme sorunu dosya yüklemelerinde çalışmıyor!


0

Benim İçin Çalışan:

if ( !refreshed()) {
   //Your Submit Here
        if (isset( $_GET['refresh'])) {
            setcookie("refresh",$_GET['refresh'], time() + (86400 * 5), "/");
        }

    }    
}


function refreshed()
{
    if (isset($_GET['refresh'])) {
        $token = $_GET['refresh'];
        if (isset($_COOKIE['refresh'])) {
            if ($_COOKIE['refresh'] != $token) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}  


function createToken($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

?>

Ve senin formunda

 <form  action="?refresh=<?php echo createToken(3)?>">



 </form>

0

Bu form.phpörnek, PRG'nin nasıl doğru kullanılacağını gösterir (form geçerli olduğunda veya olmadığında).

  • Yalnızca form geçerli olduğunda ve eylem gerçekleştirildiğinde aynı sayfaya yönlendirir.
  • Yeniden yönlendirme, formun sayfa yenilendiğinde yeniden gönderilmesini önler.
  • Form geçerli olduğunda göstermek istediğiniz başarı mesajlarını kaybetmemek için session kullanır.
  • Test için iki düğme vardır: "Geçerli gönderme", "Geçersiz gönderme". İkisini de deneyin ve bundan sonra sayfayı yenileyin.
<?php
session_start();

function doSelfRedirect()
{
  header('Location:'.$_SERVER['PHP_SELF']);
  exit;
}

function setFlashMessage($msg)
{
  $_SESSION['message'] = $msg;
}

function getFlashMessage()
{
  if (!empty($_SESSION['message'])) {
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
  } else {
    $msg = null;
  }

  return $msg;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Validation primitive example.
  if (empty($_POST['valid'])) {
    $formIsValid = false;
    setFlashMessage('Invalid form submit');
  } else {
    $formIsValid = true;
  }

  if ($formIsValid) {
    // Perform any actions here.
    // ...

    // Cool!
    setFlashMessage('Form is valid. Action performed.');

    // Prevent form resubmission.
    doSelfRedirect();
  }
}
?>
<h1>Hello form</h1>

<?php if ($msg = getFlashMessage()): ?>
  <div><?= $msg ?></div>
<?php endif; ?>

<form method="post">
  <input type="text" name="foo" value="bar"><br><br>
  <button type="submit" name="invalid" value="0">Invalid submit</button>
  <button type="submit" name="valid" value="1">Valid submit</button>
</form>

-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

Lütfen cevabınıza başkalarının öğrenebileceği bir açıklama ekleyin - nereden $everything_finegeliyor?
Nico Haase

-3

$_POST['submit']Formda olanı kaydetmek için neden değişkeni mantıksal bir ifade olarak kullanmıyorsunuz ? Her zaman aynı sayfaya yeniden yönlendirebilirsiniz (Yenilendikleri takdirde go backve tarayıcıya tıkladıklarında, gönderi gönder değişkeni artık ayarlanmayacaktır. Gönder düğmenizin bir nameve id/ veya değerine sahip olduğundan emin olun submit.


1
Bir göz atın en.wikipedia.org/wiki/Post/Redirect/Get ! Bu doğru yaklaşım
jan267
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.