Donnerstag, 29. Juni 2006

PHP

Header Location und Sessions-Variablen ein PHP-Problem

Bei der Nutzung von Session um Variablen zwischenzuspeichern muss man ein wenig aufpassen. Wenn man beispielsweise über header('Location: dieurl.php') weiterleitet kann es sein, dass die eben gesetzten Sessionvariablen fehlen...

Problem mit Session und header

In einem Script, welches ich gerade schreibe, werden ein paar Session Variablen gesetzt und danach auf eine andere Seite mit der PHP-Funktion header und Location weitergeleitet. Aber irgendwie waren die Sessionvariablen verschwunden.

Nachdem ich den Code nachgebaut hatte, machte ich mich daran dem Problem auf den Grund zu gehen. Der Code befindet sich in Listing 1.

Wie man sehen kann wird zuerst die Session mit session_start initialisiert. Danach wird der Link angezeigt. Klickt man nun auf den Link "Foo" wird beim Aufruf die Sessionvariable $_SESSION['bar'] gesetzt und danach auf das Script selbst weitergeleitet

Normalerweise würde man annehmen, das nun die Sessionvariable $_SESSION['bar'] den Wert Foo Bar! enthält. Leider ist es nicht so.

Lösung

Nachdem ich nun ein wenig in der PHP-Referenz gelesen hatte, wurde mir klar, dass die Sessionvariablen erst am Ende des Scriptaufrufs gesetzt werden.

Demnach ist die Lösung recht trivial - wenn man es weiß. Demnach muss entweder die PHP-Funktion die() oder exit() aufgerufen werden, um die Sessionvariablen zu schreiben. Falls man dies, aus irgendwelchen Gründen, nicht machen will, kann man auch die Funktion session_write_close() aufrufen. Mit session_write_close() werden die Sessionvariablen geschrieben und die Session beendet. Der "korrigierte" PHP-Code befindet sich in Listing 2



Listing 1

Download Code!

  1.  
  2. // index.php
  3.  
  4. session_start();
  5.  
  6. if(isset($_GET['foo'])) {
  7.         $_SESSION['bar'] = 'Foo Bar!';
  8.         header('Location: index.php');
  9. }
  10.  
  11. if(isset($_SESSION['bar'])) {
  12.         echo $_SESSION['bar'].'<br />';
  13.         unset($_SESSION['bar']);
  14. } else {
  15.         echo 'Kein foo = nix bar <img src="/templates/default/img/emoticons/sad.png" alt=":-(" style="display: inline; vertical-align: bottom;" class="emoticon" /> <br />';
  16. }
  17.  
  18. echo '<a href="Messenger.php?foo=a">Foo?</a>';
  19.  


Listing 2

Download Code!

  1.  
  2. // index.php
  3.  
  4. session_start();
  5.  
  6. if(isset($_GET['foo'])) {
  7.         $_SESSION['bar'] = 'Foo Bar!';
  8.         header('Location: index.php');
  9.         // Hier entweder die(), exit oder session_write_close()
  10.         die();
  11.         //exit();
  12.         //session_write_close();
  13. }
  14.  
  15. if(isset($_SESSION['bar'])) {
  16.         echo $_SESSION['bar'].'<br />';
  17.         unset($_SESSION['bar']);
  18. } else {
  19.         echo 'Kein foo = nix bar <img src="/templates/default/img/emoticons/sad.png" alt=":-(" style="display: inline; vertical-align: bottom;" class="emoticon" /> <br />';
  20. }
  21.  
  22. echo '<a href="Messenger.php?foo=a">Foo?</a>';
  23.  
Bewertung: 5 von 5, 2 Stimme(n) 4195 Klicks
PHP
Von Mr.Foo in PHP am 29.06.06@12:34 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

16 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Wolfgang Berger - #1 - 04.07.2007 11:24 - (Antwort)

Vielen Dank für die Info. Hatte nämlich das gleiche Problem, zumindest im Firefox. Der IE7 schreibt auch ohne die() oder exit() die Session-Variablen.

Mr. Foo - #1.1 - 05.07.2007 00:27 - (Antwort)

Hallo Wolfgang,

nach dem Handbuch ist das nicht möglich, wäre aber trotzdem interessant wenn das gehen würde - werde ich mal bei Gelegenheit überprüfen.

NoRiF - #1.2 - 19.06.2011 11:25 - (Antwort)

Für alle, bei denen die oben beschriebene Lösung nichts bringt:
Achtet darauf, ob ihr mit "header(location: www.page.de)" oder mit "header(location: page.de)" weiterleiten wollt, nachdem ihr die Session angelegt habt.
Mir fiel nämlich auf, dass beim ersten Loginversuch 2 Cookies angelegt wurden. Einer eben für page.de und ein zweiter für www.page.de, weil mein header mit "www" begann.
Vielleicht stößt ja jemand auf das selbe Phänomen.

Gruß NoRiF

Shaun - #2 - 13.07.2007 16:25 - (Antwort)

Interessant das es bei dir geht, hab das gleiche Problem nur deine Lösungsvorschläge haben mir nicht geholfen, schade.

Und ich benutze im übrigen IE7, dementsprechend kann ich Wolfgangs Theorie nicht bestätigen.

Mr. Foo - #2.1 - 13.07.2007 18:02 - (Antwort)

Kann es sein, dass du schon Headerinformationen zum Client geschickt hast?

TheSilentOne - #2.2 - 19.08.2007 22:02 - (Antwort)

Bei mir ist es so, dass die session nur geschrieben wird, wenn ich den Session-Namen auf dem Standard-Namen lasse.

Sobald ich session_name() aufrufe, wird nichts in die session geschrieben.

TheSilentOne - #2.2.1 - 19.08.2007 23:00 - (Antwort)

Hab jetzt rausgefunden, woran es liegt:

Die Reihenfolge ist dabei ganz wichtig.

Und zwar müssen die Befehle so abfolgen, damit es funktioniert:



warum es bei mir dabei geht, weiß ich auch nicht... aber vielleicht hilft es euch auch ;-)

Mr. Foo - #2.2.1.1 - 23.08.2007 11:23 - (Antwort)

Hallo TheSilentOne,

irgendwie fehlt die Befehlreihenfolge. Kannst du diese vielleicht nocheinmal posten?

Fritze - #2.2.1.2 - 26.02.2008 13:22 - (Antwort)

bitte die Reihenfolge noch einmal posten, ich hab das Problem. Fritze

Fabian - #3 - 02.05.2008 11:01 - (Antwort)

Vielen Dank fuer die Schilderung und Loesung des Problems. Du hast uns eben eine Menge Arbeit erspart!

Pandala - #4 - 14.04.2009 04:09 - (Antwort)

hi hab das gleiche problem im firefox und im opera
der ie netscape und safari machen da keine probleme
leider bringt die lösung bei mir nichts
hat jemand ne andere iddee ? und was für ne rheinfolge is gemeint ^^ ?

AtzeBrauner - #5 - 19.08.2009 09:06 - (Antwort)

Habe mit dem aktuellen Firefox auch die Probleme. Ich will mich in meiner Anwendung anmelden und beim ersten Versuch sagt er immer erst mal, das ich nicht angemeldet sei, sobald ich weitergeleitet werde. Beim 2ten Anmeldeversuch klappt es dann.

Der hier besprochene Lösungsansatz half mir leider nicht weiter. Habe mich nun mal an meinen Hostingpartner gewendet. Mal schauen ob der weiterhelfen kann.

Ne Lösung muss es ja geben, so viele Seiten die mit Sessions arbeiten laufen ja auch im Firefox. Habe übrigens nur im Firefox das Problem.

Mr. Foo - #5.1 - 25.08.2009 11:50 - (Antwort)

Ich würde mal es mit einem Nightly Build von Firefox probieren.

Aber ich denke eher es ist eine Problem in der Applikation.

Melde dich einmal an und schau ob ein Cookie im FF gesetzt wird.

Sevemaster - #6 - 28.08.2009 18:16 - (Antwort)

Dank dieser Lösung funktioniet es ja super!!! Vielen Danke!!!!!!!!!!!!!

Mr. Foo - #6.1 - 31.08.2009 14:21 - (Antwort)

Kein Problem :-)

Fabian - #7 - 11.11.2010 20:09 - (Antwort)

Danke dafür. Hast ein großes Problem für mich gelöst ;-)


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Header Location und Sessions-Variablen ein PHP-Problem

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen