2010-11-26 13 views
42

Estoy trabajando con PHP, y estoy creando una página de acción a la que se envía un formulario. La página busca errores, luego, si todo está bien, los redirige a la página donde se han publicado los datos. Si no, necesito redireccionarlos a la página donde estaban con un error y las variables POST. Aquí está la esencia de cómo funciona.Encabezado de PHP() redirigir con las variables POST

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> 

accion.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, lo que necesita para enviar de vuelta a la primera página. No puedo usar GET porque la entrada será demasiado grande. No quiero usar SESSION, si es posible. ¿Esto es posible?

+0

De acuerdo con algún hilo en http: //www.phpfreaks.com/forums/php-coding-help/header ('location-x-php') - question-going-2-pages-back /, puede usar 'header (" Ubicación: javascript: window.history. go (-1); ");' (no probado) – cambraca

+0

Bueno ... También esperaba intentar agregar un mensaje de error si era necesario. Eso no permitiría eso. – Yoshiyahu

Respuesta

18

Si no desea utilizar sesiones, lo único que puede hacer es realizar una POST en la misma página. Qué IMO es la mejor solución de todos modos.

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

+0

Eso es lo que he estado haciendo, pero estoy intentando hacer que las acciones de mi servidor en diferentes páginas sean más ordenadas ... – Yoshiyahu

+0

con curiosidad, ¿los datos POST estarán disponibles en nextpage.php? – jerjer

+0

@jerjer No, ese es el punto por el cual necesitas hacer todo el procesamiento en la misma página o usar sesiones para conservar los datos entre páginas. – deceze

0

Sería beneficioso verificar los datos del formulario antes de enviarlo a través de POST. Debe crear una función de JavaScript para verificar errores en el formulario y luego enviar el formulario. 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, realizando una petición AJAX para verificar los datos sería la mejor manera. La respuesta de la solicitud AJAX determinará si el formulario debe enviarse.

+1

Debería verificar los datos en el servidor, de lo contrario podría terminar con un problema de seguridad. –

+0

Exactamente lo que estaba pensando, kork. La comprobación de errores del lado del servidor siempre es la mejor. – Yoshiyahu

+0

Siempre hay problemas de seguridad, sin importar cómo se verifiquen los datos. Si la seguridad es una preocupación, una solicitud de verificación de AJAX puede ser el camino a seguir. –

6

No es posible redirigir un POST en otro lugar. Cuando haya PUBLICADO la solicitud, el navegador recibirá una respuesta del servidor y luego se realizará el POST. Todo después de eso es una nueva solicitud. Cuando especifica un encabezado de ubicación, el navegador siempre usará el método GET para buscar la página siguiente.

Puede usar algunos Ajax para enviar el formulario en segundo plano. De esa forma, los valores de tu formulario permanecen intactos. Si el servidor acepta, puede redirigir a otra página. Si el servidor no acepta, entonces puede mostrar un mensaje de error, permita que el usuario corrija la entrada y la envíe de nuevo.

+0

Excelente idea, y usted respondió mi pregunta. Sin embargo, me estoy alejando de Javascript en este proyecto. – Yoshiyahu

+1

No es así. header ('HTTP/1.1 307 Temporary Redirect') y encabezado ('HTTP/1.1 308 Permanent Redirect') mantienen el método original para redirigir usando un siguiente encabezado ('Location: new_url'). – Patanjali

+0

Se da cuenta de que esta respuesta fue de 2010 cuando estos códigos de estado eran inexistentes o al menos en gran parte no compatibles. Si tiene conocimiento de esto, puede publicar una respuesta completa que muestre cómo utilizar estos nuevos códigos de estado para resolver el problema del OP. Creo que mucha gente lo encontrará útil. –

25
// 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; 
} 
+5

Esto merece más atención ... – ryanwinchester

+0

¿Cómo se usa esto para redirigir a una página específica con la misma forma? – Rich

0

Utilice una plantilla inteligente para sus cosas, luego simplemente configure la matriz POST como una matriz inteligente y abra la plantilla. En la plantilla simplemente eco de la matriz por lo que si se aprueba:

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

no he probado esto todavía, pero voy a tratar como una solución y le hará saber lo que encuentro. Pero, por supuesto, este método asume que estás usando smarty.

Si no puede simplemente volver a crear el formulario que hay en la página de error y la información de eco en la forma o se puede enviar de vuelta los datos no importantes en un encuentro de conseguirlo y

ex.

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