Sessions: Cookies und Fallback
Thoralf Knuth
- php
Hallo Forum,
nach einigem Stöbern im Archiv bin ich auf einige schöne Beiträge gestossen, doch die Freude währt nicht lang, weil die vermeintliche Lösung als obsolet nicht mehr verfügbar ist. Also muss ich Euch doch nochmal damit belästigen. ;o)
Ich manage einige Zugriffe in meinem Script mit Sessions. Funktioniert mit Cookies wunschgemäss. Nur ohne eben nicht. Ist eine Windows-Maschine und PHP ist ohne --enable-trans-sid kompiliert. Ich will auch vermeiden, das zu ändern, da ich eben flexibel bleiben will. Das Script ist zur Weitergabe bestimmt und soll selbst in der Lage sein, dieses Problem zu lösen.
Die hier </archiv/2003/2/39171/#m214718> gestellte Frage hat als Antwort nur die Möglichkeit, manuell an alle Links die SID anzuhängen. Ist aber überflüssig, wenn der Client Cookies ordentlich unterstützt.
Hier </archiv/2003/2/38091/#m208696> wird vorgeschlagen, vor session_start(); die php.ini-Werte on-the-fly zu ändern: ini_set('session.use_trans_sid', '0'); ini_set('session.use_trans_sid', '1'); Das bringt bei mir aber absolut keine Änderung. Mit Cookies klappt, ohne nicht. error_reporting( E_ALL ) wird im Script immer als erstes ausgeführt, ini_set() bringt keine Fehlermeldung.
Über einen anderen Beitrag im Archiv bin ich letztlich auf einen Artikel aus der dclp-FAQ gestossen: http://www.dclp-faq.de/q/q-sessions-fallback.html, der genau diesen Fallback bespricht und auf develnet.org verweist: http://www.develnet.org/35.html. Und eben diese Anleitung ist obsolet und wird daher nicht mehr angezeigt. Und schliesslich meint Sven Rautenberg zu eben diese Fallback-Klasse hier </archiv/2002/8/19999/#m112209>, sie sei nicht sonderlich sinnvoll. Seine Argumente dort kann ich nach meinem logischen Verständnis nachvollziehen, weil eben der Fallback ja irgendwie in den Code muss.
Mein Testcode sieht wie folgt aus:
session_start();
isset( $_SESSION['miep'] ) ? print 'YUP' : print 'nope';
$_SESSION['miep'] = 'miep';
Ich teste mit Opera 6.05 und Phoenix 0.5 auf PHP4.2.3 und Apache 1.3.26 auf WinXP-Prof-SP1.
Hat irgendwer eine Idee, einen Hinweis oder sogar Erfahrung oder Lösung zu diesem Problem?
Gruss, Thoralf
Hallo Thoralf,
Hat irgendwer eine Idee, einen Hinweis oder sogar Erfahrung oder Lösung zu diesem Problem?
Was genau ist denn Dein Problem? Wenn trans-sid aus irgendeinem Grund nicht verfügbar ist, dann musst Du halt bei jedem Link die Konstante SID mit ausgeben. In Deinem Testcode sehe ich desweiteren auch keinen Link und keine Weiterleitung; wenn Du einfach nochmal die Seite selbst aufrufst, dann kann er bei deaktivierten Cookies die Session-ID gar nicht kennen.
Viele Grüße,
Christian
Hallo Christian,
Wenn trans-sid aus irgendeinem Grund nicht verfügbar ist,
Kann ich das dynamisch feststellen?
dann musst Du halt bei jedem Link die Konstante SID mit ausgeben.
Genau darum geht es mir. Ich will die SID nur dann angeben, wenn Cookies nicht funktionieren. Das klappt mit trans-sid zwar bei normalen Links, aber eben bei dynamischen nicht. Oder steh ich grad völlig auf dem Schlauch. Aus den oben geposteten Beiträgen habe ich eben entnommen, dass genau das Problem in den aktuelleren PHP-Versionen angeblich nicht mehr bestehen sollte.
In Deinem Testcode sehe ich desweiteren auch keinen Link und keine Weiterleitung
War nur der reine Session-Code, hier nochmal alle relevanten Teile.
<?php
session_start();
isset( $_SESSION['miep'] ) ? print 'YUP' : print 'nope';
$_SESSION['miep'] = 'miep';
print "<a href="$kompletter_URI" target="_top">$kompletter_URI</a>";
?>
<a href="index.php">index.php</a>
$kompletter_URI wird weiter oben im Script definiert und enthält eben den kompletten URI inkl. ev. Query.
Hier geht das Session Durchreichen per GET beim 1. Link eben gerade nicht, beim 2. schon. Nun möchte ich aber gerade nicht immer die SessionID als GET-Parameter anhängen. Wenn der Nutzer Cookies akzeptiert, ist das ja unnötig und irritierend.
Mein Ansatz, den ich seit gestern abend verfolge, ist vereinfacht folgender:
Wie kann ich dieses Nachschaue bewerkstelligen? Einzige bisher gefundene Lösung ist ein erneutes Aufrufen der gleichen Seite. Aber das kann es doch nicht sein, dass die Seite sich selbst mehrfach aufruft?
Zudem hab ich mehr und mehr das Gefühl, ich steh arg auf dem Schlauch und mein Bild stimmt mal wieder.
Danke für Nerven und Geduld ;)
Gruss, Thoralf
Hallo Thoralf,
Wenn trans-sid aus irgendeinem Grund nicht verfügbar ist,
Kann ich das dynamisch feststellen?
Keine Ahnung. Du hast doch bloß selbst gesagt, dass trans-sid nicht funktioniert, auch nach ini_set nicht, daher schließe ich das mal. :)
Wie kann ich dieses Nachschaue bewerkstelligen? Einzige bisher gefundene Lösung ist ein erneutes Aufrufen der gleichen Seite. Aber das kann es doch nicht sein, dass die Seite sich selbst mehrfach aufruft?
Es ist aber so. Du musst nämlich kontrollieren, ob der Cookie akzeptiert wurde. (isset ($_COOKIE[session_name()])) Das geht aber nicht innerhalb eines HTTP-Requests - Du musst zumindest "Dich selbst" nochmal aufrufen, um das festzustellen.
Viele Grüße,
Christian
Hallo Christian,
das wird Versuch Nr. 3. Den ersten hat mein Opera verschluckt, wohl beim automatischen Weiterleiten auf das Forum. Den zweiten der IE auf Arbeit. Es gibt dummerweise eine einfache Tastenkombination, selbigen unter NT abzuschiessen inklusive nervigem PC-Speaker-Biepen. *arghl* Der hier jetzt kommt im Phoenix.
dass trans-sid nicht funktioniert, [...] daher schließe ich das mal. :)
Es geht drum, dass das Script weitergegeben wird und daher mit seiner Arbeitsumgebung selbst klar kommen muss. Das mache ich schon so, seit ich mit basic vor 15 Jahren angefangen habe und das will ich auch beibehalten. ;)
Es ist aber so. Du musst nämlich kontrollieren, ob der Cookie akzeptiert wurde. (isset ($_COOKIE[session_name()])) Das geht aber nicht innerhalb eines HTTP-Requests - Du musst zumindest "Dich selbst" nochmal aufrufen, um das festzustellen.
Werd ich also auf Cookies vertrauen, und sollte selbiges nicht existieren, erst dann die SID weiterreichen. Da 'leiden' Nutzer ohne Cookies ein wenig, die berühmten 90%-Durchschnitts-User merken wohl nichts davon. ;)
Gruss, Thoralf
Hallo Thoralf,
das wird Versuch Nr. 3. Den ersten hat mein Opera verschluckt, wohl beim automatischen Weiterleiten auf das Forum. Den zweiten der IE auf Arbeit. Es gibt dummerweise eine einfache Tastenkombination, selbigen unter NT abzuschiessen inklusive nervigem PC-Speaker-Biepen. *arghl* Der hier jetzt kommt im Phoenix.
Die Tastenkombination würde mich mal interessieren. :-)
Es geht drum, dass das Script weitergegeben wird und daher mit seiner Arbeitsumgebung selbst klar kommen muss. Das mache ich schon so, seit ich mit basic vor 15 Jahren angefangen habe und das will ich auch beibehalten. ;)
Klar. Dann empfehle ich Dir einfach, die SID immer per ini_set abzustellen und es _immer_ manuell zu machen, dann kann es nicht schiefgehen.
Werd ich also auf Cookies vertrauen, und sollte selbiges nicht existieren, erst dann die SID weiterreichen. Da 'leiden' Nutzer ohne Cookies ein wenig, die berühmten 90%-Durchschnitts-User merken wohl nichts davon. ;)
_Einmal_ musst Du die SID (oder zumindest einen Parameter wie ?cookietest=1) immer weiterreichen, denn beim ersten Aufruf wird der Cookie ja erst gesetzt und da kann kein Client die SID schon haben.
Viele Grüße,
Christian
Hallo Christian,
Die Tastenkombination würde mich mal interessieren. :-)
Alt + ^
Wieso mir die regelmässig passiert, dürfte klar sein. ;) Führt bei dem IE5/NT4 dazu, dass er piept, wohl um mir eine ungültige Taste anzuzeigen, und damit erst mittels Taskmanager aufhört. Was wegen der genialen Konzeption hinter dem IE dazu führt, dass er alle neueren offenen IE-Fenster (Ich vermisse jeden Tag das tabbed-browsing) mit in den Tod reisst.
Klar. Dann empfehle ich Dir einfach, die SID immer per ini_set abzustellen und es _immer_ manuell zu machen, dann kann es nicht schiefgehen.
Yep, genauso werde ich es machen, dann habe ich zumindest immer eine definierten Ausgangszustand.
_Einmal_ musst Du die SID (oder zumindest einen Parameter wie ?cookietest=1) immer weiterreichen, denn beim ersten Aufruf wird der Cookie ja erst gesetzt und da kann kein Client die SID schon haben.
Das ist klar, Schritt 1 ist immer das Erstellen der Session. Nur beim Cookie-Client kann ich in Schritt 2 schon die Nutzlast durchführen, da der ja die SID aus Schritt 1 hat. Nur der ohne Cookie muss dann zurück zu Schritt 1 und die SID via GET durchreichen. ;)
Gruss, Thoralf