43 votos

Redirección PHP header() con variables POST

Estoy trabajando con PHP, y estoy haciendo una página de acción a la que se envía un formulario. La página comprueba si hay errores, y si todo está bien, los redirige a la página donde se han publicado los datos. Si no, necesito redirigirlos de nuevo a la página en la que estaban con un error y las variables POST. Aquí está la esencia de cómo funciona.

El HTML se vería así...

<form name="example" action="action.php" method="POST">
  <input type="text" name="one">
  <input type="text" name="two">
  <input type="text" name="three">
  <input type="submit" value="Submit!">
</form>

action.PHP se vería así...

if(error_check($_POST['one']) == true){
    header('Location: form.php');
    // Here is where I need the data to POST back to the form page.
} else {
    // function to insert data into database
    header('Location: posted.php');
}

En el caso de un error, necesito que se haga un POST de vuelta a la primera página. No puedo usar GET, porque la entrada será demasiado grande. No quiero usar SESSION, si es posible. ¿Es esto posible?

25voto

bowsersenior Puntos 7841
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

19voto

deceze Puntos 200115

Si no quieres usar sesiones, lo único que puedes hacer es POST a la misma página. Que de todas formas es la mejor solución, según la OMI.

// form.php

<?php

    if (!empty($_POST['submit'])) {
        // validate

        if ($allGood) {
            // put data into database or whatever needs to be done

            header('Location: nextpage.php');
            exit;
        }
    }

?>

<form action="form.php">
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
    ...
</form>

Esto se puede hacer más elegante, pero se entiende la idea...

6voto

Jan Thomä Puntos 4827

No es posible redirigir un POST a otro lugar. Cuando se ha POSTado la petición, el navegador obtendrá una respuesta del servidor y entonces el POST está hecho. Todo lo que sigue es una nueva petición. Cuando se especifica una cabecera de ubicación, el navegador siempre utilizará el método GET para obtener la siguiente página.

Podrías usar algo de Ajax para enviar el formulario en segundo plano. De esta manera los valores del formulario permanecen intactos. Si el servidor acepta, puedes redirigir a otra página. Si el servidor no acepta, entonces puedes mostrar un mensaje de error, dejar que el usuario corrija la entrada y enviarlo de nuevo.

0voto

Evan Mulawski Puntos 28536

Sería beneficioso verificar los datos del formulario antes de enviarlo por POST. Deberías crear una función de JavaScript para verificar el formulario en busca de errores y luego enviarlo. Esto evitaría que los datos se envíen una y otra vez, posiblemente ralentizando el navegador y utilizando el volumen de transferencia en el servidor.

Editar:

Si la seguridad es una preocupación, realizar una petición AJAX para verificar los datos sería la mejor manera. La respuesta de la solicitud AJAX determinaría si el formulario debe ser enviado.

0voto

Derrick Puntos 11

Utiliza una plantilla de smarty para tus cosas y luego simplemente establece el Array POST como un Array de smarty y abre la plantilla. En la plantilla solo haz eco del Array para que si pasa:

if(correct){
    header("Location: passed.php");
} else {
    $smarty->assign("variables", $_POST);
    $smarty->display("register_error.php");
    exit;
}

Todavía no lo he probado, pero voy a intentarlo como solución y ya os contaré lo que encuentro. Pero, por supuesto, este método asume que usted está usando smarty.

Si no es así puedes recrear tu formulario allí en la página de error y hacer eco de la información en el formulario o podrías enviar datos no importantes en un get from y obtenerlo

ex.

register.php?name=mr_jones&address==......
echo $_GET[name];

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X