Domanda

Ho il seguente codice sul mio sito (utilizzando PHP e Smarty) per cercare di evitare una forma di inviare nuovamente quando ho colpito f5:

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 per impostazione predefinita, ma modifiche al vero una volta che il modulo viene inviato con successo. Il titolo variabili Smarty e disc sono utilizzati nel modello di mantenere il contenuto del modulo non nel caso in cui v'è un errore dell'utente e hanno bisogno di cambiare ciò che sono entrati.

Se il modulo viene inviato con successo pone bln_added = true, in modo che il secondo pezzo di codice dovrebbe non solo cancellare i campi del modulo, ma anche vuota $ _POST. Ma se premo F5 i dati post è ancora lì.

Tutte le idee?

È stato utile?

Soluzione

Il tuo metodo potrebbe funzionare in teoria, ma c'è un modo molto più semplice.

Dopo aver inviato il modulo con successo, eseguire un redirect. Non importa dove, ma sarà chiaro il $ _POST.

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

Nel tuo caso, suona come si desidera reindirizzare la pagina è già in corso. Aggiungere un parametro $ _GET all'URL se si desidera visualizzare un messaggio di conferma.

Spero che questo aiuti,

Tom

Altri suggerimenti

La soluzione è un modello comunemente noto come Post / Redirect / Get

Il modo migliore per gestire le forme è quello di utilizzare auto-presentazione e un redirect. Qualcosa di simile a questo:

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.

Uso della CodeIgniter quadro :

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

È possibile riscrivere il modulo-inviare in AJAX-way. Se avete bisogno di mostrare HTML contenuti, restituirlo in JSON-formato e inserire con JavaScript (jQuery per esempio.)

Ho risolto questo (in php) da:

  1. nella forma aggiungere un identificativo univoco (id + contatore) non in base al tempo () (!!!)

  2. pubblicare in un file separato (postform.php) che controllato per una sessione con identificatore univoco che

  3. a) se la sessione con identificativo univoco non è stata trovata: posta al database e riempire sessione con identificatore univoco

    b) se è stata trovata seduta con identificatore univoco: non fare nulla

  4. dopo il verificarsi 3a / 3b redirect alla pagina con l'intestazione ( 'Località provocare: http://mydomain.com/ mypage ')

Il risultato è:
non ripresentare azioni su entrambi aggiornamento / BackButton e inviare nuovamente solo avvertimento su doppio click BackButton (ma nessuna azione reinvio)

posizione Usa intestazione dopo l'azione dopo il successo

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

Si lavora per me, se io uso sia di intestazione () o di uscita () alla fine del mio codice, ad esempio, dopo li risparmio di dati.

Il metodo migliore che ho trovato è utilizzare JavaScript e CSS. php comune metodo di reindirizzamento di intestazione ( 'Località http://www.yourdomain.com/url ); funzionerà, ma causare avvertimento "Attenzione: Non è possibile modificare le informazioni di intestazione - headers already sent" in diversi contesti e CMS come WordPress, Drupal ecc Quindi il mio suggerimento è quello di seguire il codice seguente

echo '<style>body{display:none;}</style>'; 
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
exit;

Il tag stile è importante altrimenti l'utente può sentire come pagina caricata due volte. Se usiamo tag di stile con display corpo nessuno e quindi aggiornare la pagina, poi l'esperienza dell'utente sarà come stessa intestazione php ( 'Località ....);

Spero che questo vi aiuterà:)

Header redirect dopo post è necessaria, ma non sufficiente.

Nel lato PHP dopo l'invio del modulo con successo, eseguire un redirect. Per esempio. intestazione ( 'Località http://www.example.com/form.php ');

Ma non è sufficiente. Alcuni utenti premono collegamenti due volte (doppio clic). è necessaria una JavaScript che avrebbe disabilitare pulsante di invio dopo il primo clic.

Prova il mio uno, forse non è la soluzione migliore (fatto in fretta), ma ho prova e funziona. Testato su Chrome. Clicca per vedere come appare BR

 <?php 
session_start(); // Start session
?>
<html>
 <head>
  <title>
    Test
  </title>
 </head>
 <body>
   <form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
   <input type="text" name="name"><br>
   <input type="submit" name="submit" value="Submit Form"><br>
  </form>

  <?php

  if(isset($_POST['submit']))
    {
     $_SESSION['name'] = $_POST['name']; //  Assign $_POST value to $_SESSION variable
      header('Location: refresh.php'); // Address of this - reloaded page - in this case similar to PHP_SELF
    } else session_destroy(); // kill session, depends on what you want to do / maybe unset() function will be enough

  if(isset($_SESSION['name']))
    {
     $name = $_SESSION['name'];

     echo "User Has submitted the form and entered this name : <b> $name </b>";
     echo "<br>You can use the following form again to enter a new name."; 
    }
  ?>
 </body>
</html>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top