2009-03-04 16 views
36

Dopo aver eseguito un po 'di elaborazione, voglio impostare un valore del cookie per l'input dell'utente e quindi reindirizzare a una nuova pagina. Tuttavia, il cookie non viene impostato. Se commento il reindirizzamento, il cookie viene impostato correttamente. Presumo che questo sia un problema di intestazione di qualche tipo. Qual è la soluzione migliore per questa situazione?Come posso impostare un cookie e quindi reindirizzare in PHP?

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

noti che setcookie ritorna true in entrambi i casi e non ottengo alcuna errori/avvisi/notifiche.

EDIT: Sto usando Unix/Apache/MySQL/PHP

+1

Avete provato le impostazioni dei cookie dopo l'intestazione()? –

+0

sikx - Il cookie non viene impostato neanche se utilizzo prima l'intestazione(). – Wickethewok

+0

Ho avuto un problema in cui 'Location: http: // domain.com/asd' non salverebbe il cookie. Fare 'Location:/asd' l'ha risolto per me. – Znarkus

risposta

65

Se avete delle URL o sottocartelle (come www.domain.com/path1/path2/) umani, quindi è necessario impostare percorso dei cookie a/a lavorare per tutti i percorsi, non solo quello attuale.

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

Da manuale di PHP:

Il percorso sul server in cui il cookie sarà disponibile su. Se impostato su "/", il cookie sarà disponibile all'interno dell'intero dominio. Se impostato su "/ foo /", il cookie sarà solo disponibile nella directory/foo/ e tutte le sottodirectory come /foo/bar/di dominio. Il valore predefinito è la directory corrente che il cookie è stato impostato in.

+4

Quindi avresti dovuto chiedere a @QuestionMark. – Xeoncross

+3

brutta piccola barra – petermeissner

2

Come stai testando se il cookie è impostato? I cookie sono disponibili sulla pagina10 successiva alla data .

trabocchetti comuni:

cookie non saranno visibili fino al successivo caricamento di una pagina che il cookie deve essere visibile per. Per verificare se un cookie è stato impostato correttamente, controllare il cookie in una pagina di caricamento successiva prima che il cookie scada. Il tempo di scadenza viene impostato tramite il parametro expire. Un buon modo per eseguire il debug dell'esistenza dei cookie è semplicemente chiamando print_r ($ _ COOKIE) ;.

+0

Stavo controllando se il cookie è stato impostato tramite un plug-in del browser. Anche se poi navigo verso un'altra pagina e controllo i miei cookies, non è impostato. – Wickethewok

4

Suppongo che tu stia utilizzando IIS? C'è un bug noto con le versioni di IIS meno di 7 quando si tenta di impostare un cookie e un'intestazione di posizione nella stessa richiesta.

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

+1

Sto usando IIS e ho riscontrato questo problema esatto. Conoscete una soluzione alternativa in uno script .php? –

2

sono stato in grado di risolvere questo problema utilizzando un leggero ritardo nell'intestazione di aggiornamento. Impostiamo l'intestazione (che deve essere eseguita prima di tutti i metodi che potrebbero essere emessi, come setcookie), e quindi impostare i cookie. Ho aggiunto un messaggio in modo che l'utente non veda uno schermo vuoto per quei due secondi.

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

è l'eco che fa funzionare, non l'intestazione. Stai inviando una risposta al browser, che fa sì che il cookie venga inviato anche. semplicemente impostando il cookie, il reindirizzamento non fa uno stato 302 al browser, ma trasferisce solo l'elaborazione lato server, quindi il client non sa mai del cookie. – frumbert

+0

Notato e ottimizzato! – atonyc

+0

@frumbert "semplicemente impostando il cookie, quindi il reindirizzamento non fa uno stato 302 al browser" - sì, lo fa. "trasferisce solo il lato server di elaborazione" - no. (?) Questa domanda ha già una risposta accettata che fa proprio questo (che funziona). – MrWhite

0

Utilizzare un URL relativo nell'intestazione:

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

Amico, rimuovilo @ per favore, deve essere escluso dalla codifica. Se una funzione ti dice un messaggio, leggerlo, capirlo, risolverlo. Non "nascondilo". – Runerod

Problemi correlati