Come impedire il reinvio del modulo quando la pagina viene aggiornata (F5 / CTRL + R)


132

Ho un semplice modulo che invia testo alla mia tabella SQL. Il problema è che dopo che l'utente ha inviato il testo, può aggiornare la pagina e i dati vengono inviati nuovamente senza riempire nuovamente il modulo. Potrei reindirizzare l'utente su un'altra pagina dopo l'invio del testo, ma voglio che gli utenti rimangano sulla stessa pagina.

Ricordo di aver letto qualcosa su come dare a ciascun utente un ID di sessione univoco e di averlo confrontato con un altro valore che ha risolto il problema che sto riscontrando ma ho dimenticato dove si trova.



1
Perché non vuoi reindirizzare l'utente a un'altra pagina?
Adam,

@Adam: poiché ciò è eccessivo per fare un'altra richiesta al server che a sua volta recupererà alcuni dati dal DB. Ma questo sta sprecando risorse perché abbiamo già recuperato tutti i dati richiesti durante l'elaborazione della POSTrichiesta
Eugen Konkov,

@EugenKonkov nel modello PRG, reindirizzeresti a una pagina che mostra un messaggio di successo. Non è necessario alcun ulteriore recupero dal DB.
Adamo,

@Adam: è inoltre possibile visualizzare l'intero record creato dai POSTdati ing. In questo caso è necessario SELECTda DB. Ad esempio, quando crei la fattura, verrai reindirizzato al /invoices/53quale visualizzare l'intera fattura anziché solo "successo"
Eugen Konkov,

Risposte:


96

Usa il modello Pubblica / Reindirizza / Ottieni. http://en.wikipedia.org/wiki/Post/Redirect/Get

Con il mio sito Web, memorizzerò un messaggio in un cookie o in una sessione, reindirizzerò dopo il post, leggerò il cookie / la sessione e quindi cancellerò il valore di quella sessione o variabile del cookie.


1
Ciò rende Chrome inutilizzabile per lo sviluppo in cui il business richiede solo un post!
John Peters,

26
Se usi il modello PRG, allora lasci la pagina giusta? La domanda non era come far funzionare le cose quando non si reindirizza?
Adam,

1
Mi sembra che se reindirizzi alla stessa pagina, $ _POST viene cancellato. A quanto ho capito, quello era l'effetto desiderato. Quello era il MIO effetto desiderato, comunque. Penso che la risposta sarebbe migliore se la rendesse esplicita, comunque.
donutguy640,

Funziona bene, la mia unica raccomandazione è quella di assicurarti di abilitare un rigoroso test degli errori in modo da rilevare errori localmente durante lo sviluppo, altrimenti possono passare inosservati.
Maurice,

Non risponde alla domanda Non sono sicuro del perché sia ​​la risposta accettata.
YungGun,

124

Vorrei anche sottolineare che è possibile utilizzare un approccio javascript, window.history.replaceStateper impedire un reinvio sul pulsante Aggiorna e Indietro.

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

Prova del concetto qui: https://dtbaker.net/files/prevent-post-resubmit.php

Consiglierei comunque un approccio Post / Redirect / Get, ma questa è una nuova soluzione JS.


1
Grazie, @dtbaker, è fantastico :)
Gufran Hasan,

1
Tks, questo è un lavoro perfetto per me, doveva solo creare una pagina 404 per evitare malintesi dell'utente
hsu

Semplicemente stupefacente. Grazie
user4906240

2
non funziona in Safari, ha cambiato href ma conserva ancora i dati con la richiesta di invio post
Vo Thanh Tung

Questo ha funzionato per me grazie! Perché consigli l'approccio PRG?
iJassar,

16

Dovresti davvero utilizzare un modello Ottieni reindirizzamento post per gestirlo, ma se in qualche modo sei finito in una posizione in cui PRG non è praticabile (ad es. Il modulo stesso è incluso, prevenendo i reindirizzamenti) puoi eseguire l'hashing di alcuni parametri della richiesta per creare una stringa in base al contenuto e quindi verificare di non averla già inviata.

//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!
    }

Grazie per aver condiviso, ma questo non sembra funzionare. L'aggiornamento della pagina in effetti reinvia il modulo per me. Forse mi manca qualcosa?
aLearner

L'aggiornamento della pagina reinvia tutto, ma scegliamo di elaborare i dati di invio solo se è diverso dai dati inviati l'ultima volta (che memorizziamo nella sessione var 'messageIdent'). Stai elaborando l'invio del modulo all'interno della clausola "if messageIdents are different" (ovvero dove si trova "do_your_thang ()")?
Moob,

Grazie per la tua risposta. Ho finito per implementare il modello Post / Redirect / Get, quindi non ricordo ora cosa mi stesse facendo inciampare. Grazie ancora per essere tornato indietro, comunque.
aLearner

Questo metodo non ha lo scopo di bloccare il reinvio ... ma di rilevare il reinvio in modo da poter modificare il codice in modo da non "fare" qualsiasi cosa tu faccia se questo fosse un nuovo invio. In altre parole: con questo metodo è possibile rilevare l'invio "originale" e posizionare i dati. Se NON è originale, non inserire i tuoi dati. Mostra un avviso di "tentativo dupe" o mostra invece una "conferma".
TheSatinKnight

Perché ciò funzioni è necessario aver avviato una sessione aggiungendo session_start();all'inizio del file. w3schools.com/php/php_sessions.asp dice Nota: la funzione session_start () deve essere la prima cosa nel documento. Prima di qualsiasi tag HTML.
wkille,

16

Uso questa riga javascript per bloccare il pop-up che richiede il reinvio del modulo al momento dell'aggiornamento del modulo.

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

Posiziona questa riga in fondo al file e osserva la magia


Sarebbe bello una versione di questo che non può essere disabilitata dal lato client, ma è breve, facile, veloce ... e fa quello che deve fare. Mantiene la cronologia in modo che l'utente possa tornare indietro, senza rinviare il post.
Péter Vértényi,

16

È possibile impedire il reinvio del modulo tramite una variabile di sessione.

Per prima cosa devi impostare rand()in una casella di testo e $_SESSION['rand']nella pagina del modulo:

<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>

Dopodiché controlla $_SESSION['rand']con il $_POST['randcheck']valore della casella di testo come questo:

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

3
possiamo usare <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />invece
Nikolay Bronskiy il

Sì, possiamo usare microtime () e time () anche al posto di rand (), qualunque funzione o variabile che dia un valore diverso, possiamo usarlo. MA assicurati di aver impostato quel valore sulla variabile SESSION. qui la SESSIONE deve essere verificata con il campo randcheck e per impedire il reinvio del modulo.
Savoo,

la variabile di sessione non dovrebbe essere cancellata dopo aver verificato se la sessione e post vars corrispondono?
denuncia il

1
@denoise Credo che l'idea di @Savoo sia che dopo $_POSTi dati del modulo la stessa pagina viene ricaricata ripristinando la sessione e postando le variabili. Anche la creazione di variabili dovrebbe avvenire dopo aver verificato se le variabili corrispondono. Pertanto unsetnon è necessario.
Hmerman6006,

13

Quando il modulo viene elaborato, reindirizza a un'altra pagina:

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

puoi anche reindirizzare alla stessa pagina.

se stai facendo qualcosa come commenti e vuoi che l'utente rimanga sulla stessa pagina, puoi usare Ajax per gestire l'invio del modulo


12

Ho trovato la soluzione alternativa successiva. È possibile evitare il reindirizzamento dopo l'elaborazione della POSTrichiesta manipolando l' historyoggetto.

Quindi hai il modulo HTML:

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

Quando elabori questo modulo sul tuo server invece di reindirizzare l'utente /the/result/pageimpostando l' Locationintestazione in questo modo:

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

inserisci qui la descrizione dell'immagine

Dopo aver elaborato i POSTdati renderli piccoli <script>e il risultato/the/result/page

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

La <script>si dovrebbe render:

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

Il risultato è:

inserisci qui la descrizione dell'immagine

come puoi vedere, i dati del modulo vengono modificati POSTnello process.phpscript.
Questo script ha elaborato i POSTdati e il rendering /the/result/pagecontemporaneamente con:

  1. nessun reindirizzamento
  2. nessun POSTdato relativo all'aggiornamento della pagina (F5)
  3. no POSTquando si passa alla pagina precedente / successiva attraverso la cronologia del browser

UPD

Come altra soluzione, chiedo alla funzione di richiedere al team Mozilla FireFox di consentire agli utenti di impostare l' NextPageintestazione che funzionerà come Locationintestazione e renderà post/redirect/getobsoleto lo schema.

In breve. Quando il server elabora POSTcorrettamente i dati del modulo :

  1. Imposta NextPageintestazione invece diLocation
  2. Rendering del risultato dell'elaborazione dei POSTdati del modulo come verrebbe visualizzato per la GETrichiesta nel post/redirect/getmodello

Il browser a sua volta quando vedi l' NextPageintestazione:

  1. Regola window.locationcon NextPagevalore
  2. Quando l'utente aggiorna la pagina, il browser negozia la GETrichiesta NextPageanziché riformulare i POSTdati

Penso che questo sarebbe eccellente se implementato, no? =)


11
  1. Usa l'intestazione e reindirizza la pagina.

    header("Location:your_page.php"); Puoi reindirizzare alla stessa pagina o pagina diversa.

  2. Disinserire $ _POST dopo averlo inserito nel database.

    unset($_POST);


54
La disattivazione di $ _POST non influisce affatto sul reinvio dei moduli, almeno non su Chrome.
Gavin,

2
Non funzionerà. Quando l'utente torna alla pagina posteriore, esegue nuovamente l'impostazione delle variabili POST.
Sandhu,

Qual è il motivo per l'utilizzo unset? Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa
Nico Haase,

7

Un modo abbastanza sicuro è implementare un ID univoco nel post e memorizzarlo nella cache

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

Quindi nel tuo codice fai questo:

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;
}

In realtà ho appena scritto qualcosa di simile a questo, ma non ho avuto il problema di creare una password, ho solo elencato i miei moduli (ad esempio: passaggi 1-5), quindi se sono uguali siamo fighi per andare avanti, altrimenti non salvare su db o inviare e-mail. Ma lascia che l'utente atterri ovunque lo porti.
Fernando Silva,

1
Penso che questa sia una soluzione migliore rispetto al ricaricare la pagina, dal momento che mostro un messaggio quando post successo e ricaricare la pagina eliminerà il messaggio. funziona per me, puoi anche usare un uniqid
Julio Popócatl

6

Questo metodo funziona bene per me e penso che questo sia il più semplice per fare questo lavoro.

L'idea generale è di reindirizzare l'utente ad alcune altre pagine dopo l'invio del modulo, che interromperebbe il reinvio del modulo all'aggiornamento della pagina. Tuttavia, se è necessario mantenere l'utente sulla stessa pagina dopo l'invio del modulo, è possibile farlo in diversi modi, ma qui sto descrivendo il metodo javascript.

Metodo Javascript

Questo metodo è abbastanza semplice e blocca il pop-up che richiede il reinvio del modulo all'aggiornamento dopo l'invio del modulo. Basta posizionare questa riga di codice javascript in fondo al file e vedere la magia.

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


Questo mi aiuta anche
Ankit

4

Javascript

Questo metodo è abbastanza semplice e blocca il pop-up che richiede il reinvio del modulo all'aggiornamento dopo l'invio del modulo. Basta posizionare questa riga di codice javascript in fondo al file e vedere la magia.

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

3

Basta reindirizzarlo alla stessa pagina dopo aver utilizzato i dati del modulo e funziona. L'ho provato

header('location:yourpage.php');

4
Questo è solo ripetere la stessa risposta che qualcun altro ha dato anni prima. (In effetti altri due!)
Nick Rice,

Se duplichi le risposte di altre persone, dovresti almeno aggiungere qualche spiegazione alla tua risposta per renderla interessante
Nico Haase,

3

Una versione raffinata del post di Moob. Crea un hash del POST, salvalo come cookie di sessione e confronta gli hash in ogni sessione.

// 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

Fondamentalmente, è necessario reindirizzare da quella pagina, ma può comunque creare un problema mentre Internet è lenta (reindirizzamento dell'intestazione dal lato server)

Esempio di scenario di base:

Fare clic sul pulsante Invia due volte

Modo di risolvere

  • Dalla parte del cliente

    • Disabilita il pulsante di invio dopo che il client ha fatto clic su di esso
    • Se si utilizza Jquery: Jquery.one
    • Modello PRG
  • Lato server

    • Utilizzo di data / ora di hashing differenziate in base alla data di invio della richiesta.
    • Token di richiesta. Quando il principale si carica, assegnare una richiesta temporanea che, se ripetuta, viene ignorata.

2

Come prevenire il reinvio del modulo php senza reindirizzamento. Se stai usando $ _SESSION (dopo session_start) e un modulo $ _POST, puoi fare qualcosa del genere:

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

Nel modulo HTML inserisci questo:

<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;
    }
}
?>

Pertanto, ogni volta che viene inviato il modulo, viene generato un nuovo atto, archiviato in sessione e confrontato con l'atto postale.

Ps: se stai usando un modulo Get, puoi facilmente cambiare tutto il POST con GET e funziona anche.


1

Dopo averlo inserito nel database, chiamare il metodo unset () per cancellare i dati.

unset ($ _ POST);

Per impedire l'inserimento di dati di aggiornamento, eseguire un reindirizzamento della pagina sulla stessa pagina o su una pagina diversa dopo l'inserimento del record.

intestazione ( 'Località' $ _ SERVER [ 'PHP_SELF'].);


1
Aggiungi una spiegazione alla tua risposta in modo che altri possano imparare da essa - perché è unsetnecessaria quella chiamata? Cosa succederebbe se lo saltassi?
Nico Haase,

0

Usare la risposta Post / Redirect / Get pattern da Keverw è una buona idea. Tuttavia, non sei in grado di rimanere sulla tua pagina (e penso che questo fosse ciò che stavi chiedendo?) Inoltre, a volte potrebbe non riuscire :

Se un utente Web si aggiorna prima che l'invio iniziale sia stato completato a causa di un ritardo del server, il risultato è una richiesta POST HTTP duplicata in determinati agenti utente.

Un'altra opzione sarebbe quella di archiviare in una sessione se il testo dovesse essere scritto nel tuo database SQL in questo modo:

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

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

0

Come altri hanno già detto, non è possibile smettere di usare post / redirect / get. Ma allo stesso tempo è abbastanza facile fare ciò che vuoi sul lato server.

Nella tua pagina POST convalidi semplicemente l'input dell'utente ma non agisci su di esso, ma lo copi in un array SESSION. Quindi reindirizza nuovamente alla pagina di invio principale. La pagina di invio principale inizia controllando se esiste l'array SESSION che si sta utilizzando e, in tal caso, copiarlo in un array locale e annullarlo. Da lì puoi agire su di esso.

In questo modo fai tutto il lavoro principale una volta sola, raggiungendo ciò che vuoi fare.


0

Successivamente ho cercato una soluzione per impedire il reinvio in un grande progetto. Il codice funziona perfettamente con $ _GET e $ _POST e non posso modificare il comportamento degli elementi del modulo senza il rischio di bug imprevisti. Quindi, ecco il mio codice:

<!-- 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"] );

Funziona solo per evitare il reinvio di $ _POST, non $ _GET. Ma questo è il comportamento di cui ho bisogno. Il problema di reinvio non funziona con i caricamenti di file!


0

Ciò che funziona per me è:

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;
}

?>

E nella tua forma

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



 </form>

0

Questo form.phpesempio mostra come utilizzare PRG corretto (quando il modulo è valido o meno).

  • Reindirizza alla stessa pagina, solo quando il modulo è valido e l'azione è stata eseguita.
  • Il reindirizzamento protegge il modulo dal reinvio all'aggiornamento della pagina.
  • Usa la sessione per non perdere i messaggi di successo che vuoi mostrare quando il modulo è valido.
  • Esistono due pulsanti per il test: "Invio valido", "Invio non valido". Prova entrambi e aggiorna la pagina dopo.
<?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();
}

Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa - da dove $everything_fineviene?
Nico Haase,

-3

Perché non usare semplicemente la $_POST['submit']variabile come un'istruzione logica per salvare qualunque cosa sia nel modulo. Puoi sempre reindirizzare alla stessa pagina (Nel caso in cui si aggiornino e quando colpiscono go backnel browser, la variabile di invio dei post non verrebbe più impostata. Assicurati solo che il tuo pulsante di invio abbia un namee iddi submit.


1
Dai un'occhiata a en.wikipedia.org/wiki/Post/Redirect/Get ! Questo è l'approccio giusto
Jan267,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.