2009-03-04 9 views
36

Nach ein wenig Verarbeitung, möchte ich einen Cookie-Wert auf Benutzereingaben setzen und sie dann auf eine neue Seite umleiten. Der Cookie wird jedoch nicht festgelegt. Wenn ich die Weiterleitung auskommentiere, wird der Cookie erfolgreich gesetzt. Ich nehme an, das ist ein Header-Problem irgendeiner Art. Was ist die beste Problemumgehung für diese Situation?Wie kann ich einen Cookie setzen und dann in PHP umleiten?

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

Beachten Sie, dass setcookie kehrt true in jedem Fall, und ich bekomme keine Fehler/Warnungen/Hinweise.

EDIT: Ich bin mit Unix/Apache/MySQL/PHP

+1

Haben Sie versucht, die Einstellungen der Cookie nach dem Header()? –

+0

sikx - Der Cookie wird auch nicht gesetzt, wenn ich zuerst header() verwende. – Wickethewok

+0

Ich hatte ein Problem, wo 'Location: http: // domain.com/asd' das Cookie nicht speichern würde. Doing 'Location:/asd' löste es für mich. – Znarkus

Antwort

65

Wenn Sie menschliche Urls oder Unterordner (wie www.domain.com/path1/path2/) haben, dann müssen Sie Cookie-Pfad zu/Set für alle Pfade zu arbeiten.

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

Von PHP-Handbuch:

Der Pfad auf dem Server, in dem die Cookie verfügbar sein werden. Wenn der Wert '/' ist, ist der Cookie in der gesamten Domäne verfügbar. Wenn der Wert '/ foo /' ist, ist das Cookie nur im Verzeichnis/foo/ und in allen Unterverzeichnissen wie /foo/bar/der Domäne verfügbar. Der Standard Wert ist das aktuelle Verzeichnis, das das Cookie wird eingestellt in.

+4

Dann hättest du die @QuestionMark fragen sollen. – Xeoncross

+3

böse kleiner Schrägstrich – petermeissner

2

Wie testen Sie, ob das Cookie gesetzt wird? Cookies sind auf der nächsten Seite Seite verfügbar, nachdem sie festgelegt sind.

Häufige Probleme:

Cookies werden nicht bis zum nächsten Laden einer Seite sichtbar werden, dass das Cookie sichtbar sein. Um zu testen, ob ein Cookie erfolgreich gesetzt wurde, prüfen Sie vor dem Ablauf des Cookies auf der nächsten Ladeseite nach dem Cookie. Die Ablaufzeit wird über den Parameter expire festgelegt. Eine gute Möglichkeit, die Existenz von Cookies zu debuggen, besteht darin, einfach print_r ($ _ COOKIE); aufzurufen.

+0

Ich habe überprüft, ob der Cookie über ein Browser-Plugin gesetzt wurde. Auch wenn ich dann zu einer anderen Seite navigiere und meine Cookies überprüfe, ist sie nicht gesetzt. – Wickethewok

4

Ich nehme an, dass Sie IIS ausführen? Es gibt einen bekannten Fehler mit IIS-Versionen kleiner als 7, wenn Sie versuchen, sowohl einen Cookie als auch einen Standortheader in derselben Anfrage festzulegen. , Nicht nur aktuelle

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

+1

Ich verwende IIS und treffe genau dieses Problem. Kennen Sie eine Problemumgehung in einem PHP-Skript? –

2

ich in der Lage war, dieses Problem zu lösen, indem eine leichte Verzögerung in dem Refresh-Header verwendet wird. Wir setzen die Kopfzeile (was vor allen möglichen Methoden wie setcookie geschehen muss) und setzen dann die Cookies. Ich habe eine Nachricht hinzugefügt, damit der Benutzer für diese paar Sekunden keinen leeren Bildschirm sieht.

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

Es ist das Echo, das bewirkt, dass dies funktioniert, nicht der Header. Sie senden eine Antwort an den Browser, wodurch das Cookie ebenfalls gesendet wird. Nur das Setzen des Cookies, dann das Umleiten hat keinen 302-Status für den Browser, es überträgt nur die Verarbeitungsserverseite, so dass der Client niemals über den Cookie weiß. – frumbert

+0

Bekannt und upvoted! – atonyc

+0

@frumbert "nur das Setzen des Cookies, dann die Weiterleitung hat keinen 302-Status für den Browser" - ja, tut es. "Es überträgt nur Verarbeitungsserver-Seite" - Nein, tut es nicht. (?) Diese Frage hat bereits eine akzeptierte Antwort, die genau das tut (was funktioniert). – MrWhite

0

eine relative URL im Header verwenden:

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

Alter, entfernen Sie das bitte, es muss vom Codieren verboten werden. Wenn eine Funktion Ihnen eine Nachricht mitteilt, lesen Sie sie, verstehen Sie sie, lösen Sie sie. Nicht "verstecken". – Runerod

Verwandte Themen