Fragen zu PHP Sessions
Stephan
- php
0 rob0 Tom0 Stephan0 Johannes Zeller0 Stephan0 Johannes Zeller
Hallo zusammen,
ich bin am überlegen ein Problem mit PHP Sessions zu lösen und jetzt habe ich ein paar grundlegende Fragen zur Funktionalität.
Die SessionID wird ja entweder per Cookie oder per parameter in der URL übergeben, oder? Meine Frage ist folgende, was passiert wenn man in dem Webprojekt auch stinknormale HTML Seiten hat. Gibt es dort eine Funktionalität die SessionID über die HTML Seiten weiterzureichen? Dass das mit nem Cookie klappt kann ich mir vorstellen, aber wie klappt das ohne?
Ich habe eine ganz normale Html navigation auf der seite nach dem motto <a href="seitexy.html">text</a>. In diesen HTML Seiten sollen per Formular Daten an ein PHP Script übergeben werden, welches diese dann in einer Session speichert. Jetzt navigiert der User weiter über diese normalen HTML Links. Geht nun die SessionID verloren?
Gruß
Stephan
Geht nun die SessionID verloren?
Ja, geht sie. Die ID kann ja nicht statisch in deinem Dokument eingebaut werden.
Du bräuchtest schon PHP, um den Link zu generieren.
Außerdem brauchst Du den Aufruf von session_start() zu Beginn Deiner Seiten, denn damit startest Du nicht nur eine neue Session. Das brauchst Du auch, um eine Session wieder aufzunehmen.
Es klappt mit Deinen statischen HTML-Seiten also leider nicht.
Hello,
die Sessions werden bei PHP mit eienr Session-ID geführt. Diese muss dem Client zu jeder Zeit bekannt sein, und es muss gewährleistet sein, dass er diese ID bei jedem Request auch an den Server wieder mitschickt. Wie Du schon richtig erkannt hast, funktioniert die sicherste Variante mit einem Cookie. Dieser wird aber per Cache-Anweisung üblicherweise nicht vom Browser auf der Platte gespeichert. In PHP signalisiert man das dadurch, dass man dem Cookie eine Haltbarkeitsdauer (Expire) von 0 gibt. Mit Ende der Browserinstanz verfällt dann auch der Cookie. Die PHP-Sessionverwaltung macht das automatisch so.
Der Verlust der Session bei zwischenzeitlichem Besuch "normaler" HTML-Seiten ist dadurch aber (nahezu) ausgeschlossen. Eine Abmeldung des Clients ist durch Zerstören des Cookies und ggf. Zerstören der Session mit sessionn_destroy() möglich.
Wenn keine Cookies gewünscht werden, kann man trans-sid = on benutzen und PHP dadurch anweisen, die Session-ID als hidden-Variable in jedem Formular und als Parameter an jedem Link anzuhängen. Das hat den Nachteil, dass die Session-ID auch sichtbar weitergereicht wird und, da sie in der URL steht, auch mit in Bookmarks und Logs gespeichert wird. Das bedeutet, dass sie sehr leicht zu finden (als Schlüssel) ist. Außerdem muss gewährleistet sein, dass Sessionseiten nur über Sessionseiten erreicht werden können. Das Zwischenschalten von "normalen" HTML-Seiten führt sonst zu Verlust der Sessioninformation. PHP würde dann beim Eintritt in eine Sessionseite eine neue Session starten.
Man kann Sessions aber auch selber aufbauen. PHP liefert dazu alle notwendigen Funktionen. Die Usererkennung findet dabei durch die Anmelde-Credentials USER:PASSWORD statt, die man sich über einen "auth401-Dialog" besorgt. Das ist das "normale" Anmeldefenster, dass auch von .htaccess benutzt wird.
Diese Daten sendet der Browser dann bei jedem Aufruf einer Seite aus dem Pfad innerhalb der Anmeldeseite mit. Dabei it es auch egal, ob dies nur eine "normale" HTML-Seite ist.
Die Sessiondaten kann man in einer Sessiondatei sichern. Die Sessionkennung muss man sich dann nach der Usererkennung aus einer Tabelle (Datei) holen. Das sichern der Daten am Ende des Scriptes kannst Du mit register_shutdown_script() und $daten=serialize($_SESSION) durchführen. Bei Start des Scriptes wird dann zuerst die Authentifizierung durchgeführt und dann die Daten aus der Sessiondatei mit $_SESSION=unserialize($daten) wieder hergestellt.
Leider ist bei diesem Verfahren keine Abmeldung des Clients vorgesehen. Es müssen zur Abmeldung alle Clientwindows geschlossen werden.
Grüße
Tom
Hallo Tom,
danke für deine Antwort!
Wäre es eine Lösung die HTML seiten vom PHP Parser parsen zu lassen? Würde er dann jedem normalen html link die sessionid anhängen oder macht er das nur bei php links?
Gruß - Stephan
Hallo Tom
danke für deine Antwort!
Wäre es eine Lösung die HTML seiten vom PHP Parser parsen zu lassen? Würde er dann jedem normalen html link die sessionid anhängen oder macht er das nur bei php links?
Jein. Es ist egal, wie der Link gemacht. Du must allein darauf achten, das du session_start() am Beginn der Seite aufrufst.
Gruß,
Johannes
Ich möchte aber nicht session_start() am anfang jeder seite machen.
Nocheinmal zur verdeutlichung:
Online-Shop-System mit zig Unterseiten. Alles statisches HTML (noch).
Momentan ist der Warenkorb und Bestellsystem mit Javascript geschrieben. Das möchte ich ummodeln in PHP.
Ich will aber auf keinen Fall die bereits bestehenden HTML Seiten durch php seiten ersetzen weil die HTML Seiten in den Suchmaschinen gelistet sind. Die Dateinamen müssen also gleich bleiben.
Soweit so gut, ich kann ja die html dateien auch durchn php parser jagen dann kann ich die Dateinamen gleich lassen und trotzdem php funktionalität nutzen.
Jetzt das neue PHP-Warenkorbsystem:
Die Anforderung ist dass die Session erst erstellt wird wenn jemand was in den Warenkorb legt, sprich jemand ein Formular abschickt. Also muss ich quasi am anfang jeder .html - php-seite abfragen ob bereits eine session besteht wenn ja die weiter führen wenn nicht keine erstellen.
Die SessionID muss dann (falls cookies nicht funktionieren) per parameter an jeden link in der seite angehängt werden.
Ist das technisch so möglich?
Gruß Stephan
Hallo Stephan,
Ich möchte aber nicht session_start() am anfang jeder seite machen.
Dann benötigst du die Konfigurationsoption session.auto_start.
Die Anforderung ist dass die Session erst erstellt wird wenn jemand was in den Warenkorb legt, sprich jemand ein Formular abschickt. Also muss ich quasi am anfang jeder .html - php-seite abfragen ob bereits eine session besteht wenn ja die weiter führen wenn nicht keine erstellen.
Ja.
Die SessionID muss dann (falls cookies nicht funktionieren) per parameter an jeden link in der seite angehängt werden.
Ist das technisch so möglich?
Ja. Wenn du session.use_trans_id auf 1 seztzt, wird die Session ID automatisch an alle URLs angehängt, wenn der Browser keine Cookies akzeptiert.
Gruß,
Johannes
Wie macht man das denn, dass man überprüft ob bereits eine Session besteht, ohne eine neue zu starten?
Stephan
Hello,
Wie macht man das denn, dass man überprüft ob bereits eine Session besteht, ohne eine neue zu starten?
Das ist eine spannende Frage.
Man kann die Funktion session_id() ohne Attribut aufrufen. Wenn der Rückgabewert leer ist, wurde noch keine Session gestartet.
Man kann auch nachfragen, ob die Konstante SID definiert ist.
if (defined("SID")) { echo "Session besteht"; }
Diese existiert nämlich nur, wenn eine Session besteht - vorausgesetzt natürlich, dass man sie nicht selber definiert hat.
Wenn man mit session_start() eine Session gestartet hat, kann man mit Hilfe der Kontante SID auch feststellen, ob die Session neu gestartet wurde (SID hat einen Inhalt) oder ob sie wieder aufgenommen wurde. SID ist nur ein Leerstring.
Grüße
Tom
Gut! Danke für die Info! Das hilft mir schon mal weiter. Ich werde das am WE mal versuchen so umzusetzen, falls es Probleme gibt melde ich mich nocheinmal.
Danke Stephan
Moin!
Wenn man mit session_start() eine Session gestartet hat, kann man mit Hilfe der Kontante SID auch feststellen, ob die Session neu gestartet wurde (SID hat einen Inhalt) oder ob sie wieder aufgenommen wurde. SID ist nur ein Leerstring.
Nein, das kann man nicht damit feststellen.
- Sven Rautenberg