phpbar.de logo

Mailinglisten-Archive

[php] PHP4-Session-Stolpersteine

[php] PHP4-Session-Stolpersteine

Ralf Geschke php_(at)_phpcenter.de
Wed, 27 Jun 2001 22:01:07 +0200


Hallo !

Ich beschaeftige mich nun zum ersten Mal so richtig mit den
von PHP4 bereitgestellten Session-Funktionen. Vorher habe
ich mit einer eigenen Session-Library (s2lib) gearbeitet,
welche noch aus PHP3-Zeiten stammt. Nun gut, ich dachte es 
waere an der Zeit, den ganzen Overhead mal loszuwerden und mit
den nativen Session-Funktionen von PHP4 zu arbeiten. 

Das Verhalten jener verwundert mich jedoch sehr. 

Kleines Beispiel:

Datei 1.php:
============
<?php

session_start();
print "count ist: " . $HTTP_SESSION_VARS[count] . "<p>";
?>
<h3>Ok.</h3>
<a href="2.php?<?=SID?>">2.php</a>
=============

Datei 2.php:
============
<?php
session_start();
session_register("count");
if (!$count) $count = 1;
else $count++;
?>
<h3>Ok.</h3>
<a href="1.php?<?=SID?>">1.php</a>
=============

Ok, ich denke mal, dass das Beispiel klar sein duerfte, und soweit
funktioniert es auch, vom Sinn mal ganz abgesehen. 

Also: Zuerst Aufrufen von 1.php. Es wird die Frage gestellt, ob
man den Cookie PHPSESSID mit eben der neuen Session-ID annehmen 
moechte. Falls ja, wird die Session-ID im Cookie gespeichert und
der Rest ist gegessen. 

Interessanter ist die Sache, falls ich den Cookie ablehne. 
Da der Text PHPSESSID={Session-ID} [^1] in SID gespeichert wurde,
sollte die URL, welche auf 2.php verweist, entsprechend
erweitert werden, so dass jene Seite mit dem URL-Parameter
PHPSESSID={Session-ID} aufgerufen wird. Ok, das klappt auch.

Was mich hingegen wundert: Klickt man auf die korrekt erweiterte
URL 2.php?PHPSESSID={Session-ID} wird erneut versucht, ein 
Cookie zu setzen. 

Das Spiel wiederholt sich bei jedem Klick auf die jeweiligen
URLs. 

Dieses Verhalten empfinde ich als extrem suboptimal.

Vielmehr hatte ich es mir so vorgestellt, dass zwar beim
_ersten_ Initialisieren bzw. Erzeugen der Session-ID nach 
dem Cookie gefragt wird, aber dann nie mehr wieder.
D.h. verweigert man den Cookie, wird die URL erweitert. 
Klickt man auf die naechste URL, ist die Session doch durch
den GET-Parameter gegeben, ergo muss doch gar nicht mehr
nach dem Cookie gefragt werden, sondern die Session-ID kann
anhand des GET-Parameters festgestellt werden. 

Andernfalls wird man bei jedem Klick auf eine dieser URLs
nach dem Cookie gefragt, obgleich die Session-ID als GET
Parameter uebergeben wird, und obgleich man die Frage bereits
beim allerersten Klick auf eine der URLs verneint hat.

Dies ist IMHO ziemlich stoerend, weil man entweder nach wenigen
Klicks so genervt ist, dass man den Cookie akzeptiert - oder die
Site gleich wieder verlaesst. Also mir geht es zumindest so. ;-)

Nun laesst sich wohl global in der php.ini einstellen, ob 
Cookies ueberhaupt benutzt werden sollen. Dies hilft jedoch
nicht weiter, denn eigentlich moechte ich den Nutzer vor
die Wahl stellen - eben wenn er Cookies akzeptiert, werden
diese genutzt, andernfalls die Session-ID in der URL gespeichert,
aber dann soll auch bitte nicht bei jedem Klick erneut die
Frage nach dem Cookie gestellt werden. 

Tja, nun stellt sich die Frage, ob ich etwas uebersehen, 
fehlerhaft implementiert oder falsch getestet habe?
Oder gibt es Workarounds oder undokumentierte Funktionen, welche
das Session-Verhalten beeinflussen?

Wie erwaehnt, in diversen Buechern oder dem Manual habe ich nichts
dergleichen gefunden. 

Das o.g. Beispiel liegt unter http://www.bttr.org/test/1.php

Vielen Dank & Beste Gruesse,
   Ralf

[^1] Man ersetze {Session-ID} durch die eben jeweils gueltige
32-stellige Session-ID. 
-- 
: www  : http://www.bttr.org  :  http://der.leitweganzeiger.de
: mail : ralf_(at)_bttr.org       :::         rg_(at)_leitweganzeiger.de 


php::bar PHP Wiki   -   Listenarchive