2009-03-04 15 views
36

Después de hacer un poco de procesamiento, quiero establecer un valor de cookie para la entrada del usuario y luego redirigirlos a una página nueva. Sin embargo, la cookie no se está configurando. Si hago un comentario sobre la redirección, la cookie se establece correctamente. Supongo que este es un problema de encabezado de algún tipo. ¿Cuál es la mejor solución para esta situación?¿Cómo puedo configurar una cookie y luego redirigirla en PHP?

if($form_submitted) { 
    ... 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30); 
    header("Location: $url"); 
    exit; 
} 

Tenga en cuenta que setcookie vuelve true en cualquiera de los casos y no consigo ninguna errores/advertencias/avisos.

EDIT: estoy usando Unix/Apache/MySQL/PHP

+1

¿Usted intentó configuración de la cookie después de la cabecera()? –

+0

sikx: la cookie no se establece si uso header() primero. – Wickethewok

+0

Tuve un problema donde 'Location: http: // domain.com/asd' no guardaba la cookie. Al hacer 'Location:/asd', lo resolvió para mí. – Znarkus

Respuesta

65

Si tiene direcciones URL o subcarpetas (como www.domain.com/path1/path2/) humanos, entonces debe establecer la ruta de cookies a/a trabajar por todos los caminos, no sólo uno actual.

if($form_submitted) { 
    ... 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/'); 
    header("Location: $url"); 
    exit; 
} 

De manual de PHP:

La ruta en el servidor en el que estará disponible en la galleta. Si se establece en '/', la cookie estará disponible dentro de todo el dominio. Si se establece en '/ foo /', la cookie solo será disponible en el directorio/foo/ y en todos los subdirectorios, como /foo/bar/de dominio. El valor por defecto es el directorio actual que la cookie se establece en.

+4

Entonces deberías haber preguntado @QuestionMark. – Xeoncross

+3

desagradable pequeña barra – petermeissner

2

¿Cómo estás probando si se ha establecido la cookie? Las cookies están disponibles en la siguiente página una vez que se configuran.

Errores comunes:

cookies no se hacen visibles hasta la siguiente carga de una página que la cookie debe ser visible para. Para comprobar si una cookie se configuró correctamente, compruebe la cookie en la página de carga siguiente antes de que caduque la cookie. El tiempo de caducidad se establece mediante el parámetro expirar. Una buena manera de solucionar la existencia de cookies es simplemente llamando a print_r ($ _ COOKIE) ;.

+0

Estaba comprobando si la cookie se configuró a través de un complemento de navegador. Incluso si navego a otra página y verifico mis cookies, no está configurado. – Wickethewok

4

Supongo que está ejecutando IIS? Hay un error conocido con versiones de IIS de menos de 7 cuando se intenta establecer una cookie y un encabezado de ubicación en la misma solicitud.

http://support.microsoft.com/kb/q176113/

+1

Estoy usando IIS y toco este problema exacto. ¿Conoce una solución alternativa en un script .php? –

2

que era capaz de resolver este problema mediante el uso de un ligero retraso en la cabecera de actualización. Configuramos el encabezado (que debe hacerse antes de cualquier método que pueda generar resultados, como setcookie), y luego configuramos las cookies. Agregué un mensaje para que el usuario no vea una pantalla en blanco durante esos dos segundos.

header("refresh: 2; url=$url"); 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/'); 
    echo "Processing, please wait..."; 
+2

es el eco que hace que esto funcione, no el encabezado. Está enviando una respuesta al navegador, lo que hace que la cookie también se envíe. simplemente configurar la cookie, redirigir no hace un estado 302 al navegador, simplemente transfiere el lado del servidor de procesamiento, por lo que el cliente nunca sabe acerca de la cookie. – frumbert

+0

¡Observado y votado! – atonyc

+0

@frumbert "simplemente configurar la cookie y luego redirigir no hace un estado 302 para el navegador" - sí lo hace. "simplemente transfiere el lado del servidor de procesamiento" - no, no. (?) Esta pregunta ya tiene una respuesta aceptada que hace exactamente eso (que funciona). – MrWhite

0

utilizar una dirección URL relativa en el encabezado:

@Header("Location: orders_9090_1.php"); 
+0

Amigo, elimine ese @ por favor, debe prohibirse la codificación. Si una función te dice un mensaje, léelo, entendedlo, resuélvelo. No "ocultarlo". – Runerod

Cuestiones relacionadas