2011-09-01 13 views
5

Estoy desarrollando un script php que contiene un formulario html.¿La función php "header()" desarma las variables globales?

Si no todos los campos se llenan de forma correcta el guión señalará un error y redirigir de nuevo a la misma página con la función de cabecera estableciendo una variable de error para sí con el método get:

header("Location: registration_page.php?error_empty=yes"); 

mi script tiene una parte de manejo de errores en la que se destacan los campos que contienen un error, pero me gustaría mantener el valor de los campos correctamente rellenos.

Me estoy poniendo en práctica esta función ya que encontramos en esta otra pregunta: ¿

How can I keep a value in a text input after a submit occurs?

pero el problema es que cuando la página se vuelve a abrir las formas no contendrán los valores antiguos.

Mi pregunta es: ¿alguien sabe si la función de encabezado une variables globales en la matriz $ _REQUEST?

¿Y sabes qué tipo de solución podría adoptar? ¿Tal vez sesiones?

Gracias de antemano,

Matteo!

Respuesta

8

$_COOKIES se quedará set, pero $_POST & $_GET serán destruidos, y cuando el cliente se está moviendo a una nueva página. Si necesitan ser retenidos, primero deben almacenarse en $_SESSION antes de llamar al redireccionamiento.

session_start(); 
$_SESSION['last_post'] = $_POST; 
header("Location: http://example.com"); 
exit(); 

// On the redirected page, use the stored POST values and unset them in $_SESSION 
session_start(); 
if (empty($_POST) && isset($_SESSION['last_post'])) { 
    $post = $_SESSION['last_post']; 
    unset($_SESSION['last_post']); 
} 
else $post = $_POST; 
+0

después de comenzar la sesión, ¿cuándo debería destruirlo? cuando todos los campos se han llenado con éxito? – Matteo

+1

@Matteo 'session_destroy()' se llama implícitamente cuando se completa la ejecución del script. No es necesario que lo llame a menos que tenga un motivo para cerrar la sesión antes de que finalice el script. 'session_destroy()' _does not_ remove las variables de sesión. Simplemente desconecto el script actual de la sesión. –

+0

@Matteo vea la adición anterior sobre cómo deshacer la publicación almacenada de '$ _SESSION' después de usarla –

3

¿Alguien sabe si la función de encabezado une variables globales en la matriz $ _REQUEST?

No, no es así. Las cookies ($_COOKIE) se mantendrán.

Obviamente $_GET contendrá todo lo que tiene en la redirección (por ejemplo: $_GET['error_empty'] = 'yes') and $ _POST` estará vacía porque se está publicando no

Por lo tanto, $_REQUEST será una combinación de $_COOKIE y los nuevos parámetros que $_GET. establecer.


Es probable que no debe utilizar $_REQUEST de todos modos. especificar exactamente donde se espera que los parámetros de la petición para ser ...

2

No, pero hace una nueva solicitud. Una nueva solicitud significa un nuevo $_REQUEST que no necesariamente tiene todos los datos anteriores. $_COOKIE seguirá allí, pero $_GET y $_POST serán nuevos, lo que significa que $_REQUEST reflejará eso. ($_FILES también estará vacío y mientras no esté en `$ _REQUEST, se restablecerá otro valor proporcionado por el usuario).

Si desea restaurar la forma, tendrá que o bien poner todas las variables en la url en la cabecera, o utilizar $_SESSION o setcookie y luego restaurar desde $_GET, $_SESSION o $_COOKIES.

+0

valores tan viejos no serán accesibles por eso si un uso el comando ? el resultado estará vacío? – Matteo

+0

'$ _FILES' se eliminó de' $ _REQUEST' hace mucho tiempo. – NullUserException

+1

Eso es correcto. Debido a que '$ _REQUEST' depende de la entrada del navegador, si el navegador realiza una nueva solicitud, se vacía' $ _REQUEST'. – cwallenpoole

Cuestiones relacionadas