Pregunta

Tengo el siguiente código en mi sitio (usando php y Smarty) para tratar de evitar una forma de volver a presentar cuando golpeo 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 es falsa por defecto, pero los cambios en cierto una vez que el formulario se ha enviado correctamente. El título variables de sabelotodo y la descripción se utilizan en la plantilla para mantener el contenido del formulario allí en caso de que haya un error de usuario y necesitan cambiar lo que entraron.

Si el formulario se ha enviado correctamente establece bln_added = true, por lo que el segundo bit de código no sólo debe borrar los campos del formulario, sino también vacía $ _POST. Pero si presiono F5 los datos post es todavía allí.

¿Alguna idea?

¿Fue útil?

Solución

Su método podría funcionar en teoría, pero hay una manera mucho más fácil.

Después de enviar el formulario con éxito, realizar un redireccionamiento. No importa dónde, sino que va a borrar el $ _POST.

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

En su caso, parece que desea redirigir a la página que ha hecho. Anexar un parámetro $ _GET a la URL si desea mostrar un mensaje de confirmación.

Espero que esta ayuda,

Tom

Otros consejos

La solución es un patrón conocido comúnmente como Mensaje / Redirigir / Obtener

La mejor manera de manejar las formas es el uso de la auto-presentación y una redirección. Algo como esto:

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 de la CodeIgniter marco :

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

Puede volver a escribir su forma de presentar en AJAX vías. Si necesita mostrar HTML en contenido, devolverlo en formato JSON-e inserte con Javascript (jQuery por ejemplo.)

I resuelto este (en php) por:

  1. en forma añadir un identificador único (id + contador) no basado en el tiempo () (!!!)

  2. poner en un archivo separado (postform.php) que comprueba para una sesión con el identificador único

  3. a) si la sesión con el identificador único no se ha encontrado: correo postal a la base de datos y llenar la sesión con el identificador único

    b) si se encontraba sesión con el identificador único: no hacer nada

  4. después de que cualquiera 3a / 3b redirigir a la pagina de resultados con header ( 'Location: http://mydomain.com/ mypage ')

El resultado es:
sin volver a presentar acciones en cualquiera de refresco / BackButton y sólo volver a presentar advertencia en doble click BackButton (pero ninguna acción volver a ejecutar)

El uso de cabecera lugar después de la acción posterior éxito

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

A mí me funciona bien si uso cabecera () o de salida () al final de mi código, por ejemplo, después puedo guardar algunos datos.

El mejor método que he encontrado es el uso de javascript y css. php común cabecera del método de redirección ( 'Lugar: http://www.yourdomain.com/url ); funcionará pero motivo de la advertencia "Advertencia: No se puede modificar la información de cabecera - cabeceras ya enviado" en diferentes marcos y CMS como WordPress, Drupal, etc Así que mi sugerencia es seguir el siguiente código

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

La etiqueta de estilo es importante lo contrario el usuario puede sentir como la página cargado dos veces. Si utilizamos etiqueta de estilo con pantalla de ninguno cuerpo y luego actualizar la página, a continuación, la experiencia del usuario será como mismo que php header ( 'Location: ....);

Espero que esto ayudará a:)

Header redirigir después del post es necesario, pero insuficiente.

En lado PHP después de enviar el formulario con éxito, realizar un redireccionamiento. P.ej. header ( 'Location: http://www.example.com/form.php ');

Pero no es suficiente. Algunos usuarios de prensa Enlaces dos veces (doble clic). Un JavaScript es requerido que imposibilitaría botón de enviar después de la primera clic.

Trate de mi propio, tal vez no es la mejor solución (hecho rápidamente), pero no tengo la prueba y funciona. Probado en Chrome. Haga clic para ver cómo se ve 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top