[Guide]Sessions in PHP

  • Hallo Core'lers
    Da xSay seinen Guide trotz Aufforderung nicht erweitert hat, habe ich diesen gelöscht und den Entschluss gefasst einen neuen zu schreiben.
    Und hier ist die bessere Variante.

    [FELD="Inhalt"]

    1. Vorwort
    2. Was ist eine Session
    3. Wie benutzt man Sessions
    4. Beenden einer Session
    5. Fehlerbehandlung - Could not send Session Cookie, Headers already send
    6. Nachwort


    [/FELD]

    [COLOR="Orange"][SIZE="4"]1. Vorwort:[/SIZE][/COLOR]
    Jeder, der schonmal im Internet war (denke das waren so die meisten, die hier sind^^), kennt doch sicher Formulare.
    Diese Dinger werden meistens dafür genutzt, Daten von Usern eingeben zu lassen, um sie dann für Registrationen o.Ä zu nutzen.
    Die PHP'ler unter uns werden sicher wissen, dass man zum Speichern von Daten Variablen nehmen kann. (Auch unsere Programmierer unter uns, Variablen gibts fast überall)
    Jedoch haben Variablen in PHP eine Lebensdauer von 1 Seite, das heißt nach einem Seitenwechsel sind die Daten weg.
    Um nun eine Langzeitspeicherung vorzunehmen, benutzt man Sessions.

    [COLOR="Orange"][SIZE="4"]2. Was ist eine Session[/SIZE][/COLOR]
    Eine Session, auch Sitzung genannt, ist das Zauberwort um Daten zu speichern.
    Eine Session hat eine längere Lebensdauer als eine Variable, nämlich solange wie man den Browser nicht schließt.
    Wenn eine Session gestartet wird, vergibt der Server eine einzigartige ID, die so genannte SessionID.
    Diese wird in Form eines Cookies auf dem PC gespeichert und dieses Cookie hat die besagte Lebendauer einer Browsersession.
    Bei jedem weiteren Seitenaufruf schickt der Browser alle SessionIDs mit, die er kennt und dies an alle Webserver, die man im Verlauf einer einzigen Session ansurft.
    Der Server vergleicht nun die IDs mit denen, die er kennt und noch vorhanden sind. (Sessions haben auch auf dem Server nur eine begrenzte Lebensdauer, meist werden die Daten einer bestimmten Session nach 30min ohne Anforderung gelöscht, hängt von der Konfiguration des Webservers ab.)
    Sollte eine SessionID mit der auf dem Server übereinstimmen, so sendet der Webserver die Daten der jeweiligen Session an den Browser, bzw er lädt diese und nutzt sie bei der Abarbeitung von der jeweiligen Webseite.
    Lange Theorie, ich weiß, aber nun kommen die interessanteren Dinge, nämlich die Anwendung^^

    [COLOR="Orange"][SIZE="4"]3. Wie benutzt man Sessions[/SIZE][/COLOR]
    Als erstes sollte man Sessions einsatzbereit machen.
    Dies erfolgt über

    PHP
    <?php session_start(); ?> /*falls man am Anfang einer Seite schon nen PHP Block hat, kann man den Befehl auch dort einsetzen ohne das <?php ?>*/


    Diesen Befehl am besten an den Anfang der Seite, um die volle Funktionalität zu gewährleisten.
    Wie gesagt, der Browser schickt die SessionIDs, die er kennt zum Webserver und der Webserver nimmt dann die passenden SessionID und startet die Session mit dieser ID.
    Nachdem die Seite wieder an den Browser gesendet wurde, sind alle Aktionen geschehen, die eine Session nutzen und die anderen Dinge auch.
    Aber dazu später mehr.

    Nachdem eine Session geladen oder erstellt wurde wurde (Anmerkung: Man kann mit o.g Befehl auch eine Session starten), kann sie benutzt werden.
    Nehmen wir mal an, wir wollen einen Benutzer einer Webseite identifizieren solange er auf der Webseite online ist und seinen Namen als Begrüßung nutzen.
    Natürlich könnte man dafür Variablen nutzen, aber das ist auf Dauer lästig.
    Stattdessen nutzen wir Sessions. (Anmerkung 2: Sessions sind auch Variablen, bzw eine sog. Superglobale als Array.)
    Nun, nachdem sich der User eingeloggt hat und die Daten überprüft worden sind, wollen wir die Daten in der Session speichern.
    Dazu kann man die Session wie ein normales Array nutzen, mit der Ausnahme dass Session immer Global sind und damit überall gültig, auch wenn sie in einer Funktion definiert wurden.
    Hier ein Beispiel:

    Code
    $_SESSION['Name'] = "internetfreak" //Hiermit wird dem Key Name aus dem SessionArray der Name internetfreak zugewiesen.


    Wenn wir nun diese Information nutzen wollen, so reicht folgender Befehl:

    Code
    echo $_SESSION['Name'];


    In unserem Beispiel lautet der Befehl:

    Code
    echo 'Willkommen '.$_SESSION['Name];


    Der Befehl erzeugt folgende Ausgabe:

    Code
    Willkommen internetfreak.


    Wie ihr seht, lassen sich Sessions nutzen wie eine normale Variable, mit der Ausnahme dass man sie erst durch o.g Befehl einsatzbereit machen muss.

    [COLOR="Orange"][SIZE="4"]4. Beenden einer Session[/SIZE][/COLOR]
    Um voranzukommen und das Thema nicht zu lang zu machen, folgt nun dieser Punkt.

    Also nehmen wir unsere Session von vorhin.
    Wir wollen nun die Session beenden, weil der User sich ausgeloggt hat.
    Dazu haben wir mehrere Möglichkeiten.
    1. Der User beendet den Browser - Die Session wird ungültig weil die Sitzung beendet ist.
    2. Wir löschen die Session manuell.
    Dies können wir durch folgende Befehle lösen:

    Code
    //Session öffnen zum bearbeiten
    session_start();
    // komplette session nichtig machen
    session_unset();
    //session zerstören
    session_destroy();


    Nachdem dies getan wurde, sind alle funktionen welche Sessions brauchen, nicht mehr verfügbar.
    Man muss die Session neu anlegen bzw füllen, dann klappts wieder^^

    [SIZE="4"][COLOR="Orange"]5. Fehlerbehandlung - Could not send Session Cookie - Headers already send:[/COLOR][/SIZE]
    Sollte euch dieser Fehler vorkommen, keine Panik.
    Hier meine Fehlerbehandlung, bissl weiter unten schonmal erklärt^^


    [SIZE="4"][COLOR="Orange"]6. Nachwort:[/COLOR][/SIZE]
    So das war mein Guide, hoffe er gefällt euch besser als der von xSay
    Lob Kritik usw könnt ihr hier posten^^
    Falls ihr noch irgendeinen Guide wollt, so schreibt mir ne PM, ich werde sehen ob ich genug weiß für nen Guide.
    Zum Abschluss noch paar nette Infos über den Guide:

    [FELD="Statistiken:"]
    Allle Infos stammen aus Word, über die Funktion "Wörter zählen" kam ich dran
    Seiten: 3 (ohne BB-Code nur 2)
    Wörter: 801 (ohne BB-Code nur 796)
    Zeichen inklusive BB-Code ohne Leerzeichen: 4.728
    Zeichen inklusive BB-Code und Leerzeichen: 5.461
    Zeichen ohne BB-Code und Leerzeichen: 4.351
    Zeichen ohne BB-Code mit Leerzeichen: 5.086
    Absätze: 68 (ohne BB-Code: 61)
    Zeilen: 107 (ohne BB-Code: 100)
    Gesamte Zeit die gebraucht wurde für den Guide: 1-2 Stunden)
    Diese Statistiken wurden mit Sorgfalt erstellet und können abweichen, ich übernehme keine Haftung für Abweichungen.
    Dieses Statistikenfeld zählt übrigens nicht mit zur Berechnung
    EDIT 03.03.2010: Statistiken Out of Date
    [/FELD]

  • Zitat

    Eine Session hat eine längere Lebensdauer als eine Variable, nämlich solange wie man den Browser nicht schließt.

    Eine Session wird üblicherweise nach etwa 1ner Stunde (geschätztn und Browserabhänig) ohne Aktuallisierung,
    also entweder ein Refresh der Page oder ein Klick auf eine andere Seite automatisch
    zerstört.

  • [FONT="Comic Sans MS"][COLOR="PaleTurquoise"][SIZE="3"]Hab ich doch erwähnt, dass ne Session nach ca 30min ohne Aktivität gelöscht wird.
    Unter Punkt 2 stehts doch drin o_ô
    nur habe ich halt 30min verwendet, hängt aber von der Konfiguration ab
    Und mit dem Browser hats meist eh wenig zu tun, Sessions sind Serverabhängig und werden nur durch ein Sessioncookie auf dem PC gesichert, welches eine Lebendauer von 1 Browsersession hat.
    Nur der Server löscht die Session sobald sie nicht mehr genutzt wurde seit o.g Zeit[/SIZE][/COLOR][/FONT]

  • Zitat von internetfreak;90577

    [FONT="Comic Sans MS"][COLOR="PaleTurquoise"][SIZE="3"]Hab ich doch erwähnt, dass ne Session nach ca 30min ohne Aktivität gelöscht wird.
    Unter Punkt 2 stehts doch drin o_ô
    nur habe ich halt 30min verwendet, hängt aber von der Konfiguration ab
    Und mit dem Browser hats meist eh wenig zu tun, Sessions sind Serverabhängig und werden nur durch ein Sessioncookie auf dem PC gesichert, welches eine Lebendauer von 1 Browsersession hat.
    Nur der Server löscht die Session sobald sie nicht mehr genutzt wurde seit o.g Zeit[/SIZE][/COLOR][/FONT]

    sawry, das hab ich irgentwie überlesen.

  • [FONT="Tahoma"][COLOR="DarkOrange"][SIZE="2"]Tut mir Leid das ich noch andere Sachen zutun habe.
    Naja egal der Guide ist auch ganz okay , eventuell könntest du ja mal ein paar Praktische Beispiele zeigen.
    Und du könntest noch Fehlermeldungen erklären.

    Code
    Cannot send session cookie - headers already sent,Warning: session_start() [function.session-start]: open(...) failed: No such file or directory

    [/SIZE][/COLOR][/FONT]

    [CENTER]
    [/CENTER]

  • [FONT="Comic Sans MS"][COLOR="PaleTurquoise"][SIZE="3"]Ja, aber du hättest zumindest mal zeit finden können, kurz bissl zu ergänzen.
    Naja auch schön dass du meinen Guide gut findest.
    ZU dem Fehler:
    Wie man der Meldung entnehmen kann, wurden die HTTP-Header schon gesendet.
    Aber hier die Erklärung warum der Fehler kommt und wie er zu beheben ist:
    session_start(); ist eine so genannte Header Funktion.
    Es gibt verschiedene Header Funktionen cookie_start() gehört auch dazu.
    (P.S: Damit kann man Cookies starten und nutzen, wie bei Sessions, nur dass Cookies von der Lebendauer wieder anders sind.)
    Aber nun zurück zum Fehler.
    Der Befehl session_start MUSS! vor allen anderen Befehlen stehen, wo eine Ausgabe getätigt wird.
    Am besten man setzt ihn noch vor den einleitenden <html> Tag, also in Zeile 1 der Seite die Sessions nutzen soll.
    Ansonsten, setze vor das session_start noch ein "ob_start()" und nach dem session_start() ein "ob_end_flush()"
    ob steht für OutPut Buffering, d.h es fängt die Ausgabe ab und speichert sie in einem Puffer.
    So kann eine Header Information auch noch wirken, wenn bereits eine Ausgabe getätigt wurde.
    Nützlich ist das z.B. bei Nutzung von include, da je nach Stelle des Includes schon Ausgaben getätigt worden sein können.
    Hoffe der Fehler wird so behoben, sollte er zumindest, ich benutze Sessions schon ne Zeit lang.

    EDIT:
    Ja Fehlermeldungen könnte ich noch hinzufügen im Thread, sofern es noch welche gibt, mir ist eig nur die Fehlermeldung von dir vorgekommen, sonst sollte es normalerweise keine geben bei sachgemäßer Behandlung.

    Praktische Beispiele kommen noch, wollte ein komplettes Login System veröffentlichen, aber war zu faul es hier in MMO zu schreiben.
    Sobald ich das Loginsystem für meine aktuelle HP wo ich dran bin fertig habe, werde ich es hier auch reinstellen.
    Komplett und unzensiert sowie auskommentiert^^
    [/SIZE][/COLOR][/FONT]

  • Nunja ich habe da eine Frage:
    Ist es möglich die Variable $_SESSION['lol'] aus der Datei index.php auf irgendeine
    Weise in die Datei XYZ.php zu bekommen ?

    [CENTER]

    Zitat

    "Eine IP ist im Internet nötig - ein IQ leider nicht..."
    "Der Döner sei mit dir mein junger Padawan"
    "Hat der König der Tiere , der Löwe Geburtstag. Er wünscht sich von allen Tieren 1 Korb voll Fleisch , ansonsten würde er sie mit seinem dicken Penis schlagen.
    Der Hase kommt mit einem Korb voll Möhren. Der Löwe fragt den Hasen wieso er nur mit einem Korb voll Möhren komme , darauf antwortet der Hase er sei eben nicht so ein guter Jäger und der Löwe solle ihm verzeihen. Daraufhin schlägt der Löwe den Hasen mit seinen dicken Penis. Der Hase lacht und weint [...] und lacht und weint.
    Da fragt ihn der Löwe wieso er weine , woraufhin der Hase antwortet dass er weine weil es weh tue und er lache weil der Igel mit einem Korb voll Pilzen käme."


    [/CENTER]

  • Zitat von despiteous;145457

    Nunja ich habe da eine Frage:
    Ist es möglich die Variable $_SESSION['lol'] aus der Datei index.php auf irgendeine
    Weise in die Datei XYZ.php zu bekommen ?

    ja einfach auch in dieser datei das

    session_start();
    eingeben und wie in der index.php die vergebenen $session variabele benutzen,

    Mfg Me

    edit :

    beispiel :

    index.php :

    PHP
    <?php
    session_start();
    $session['user'] = 'Eldoran';
    echo  ' <a href="xyz.php">Hier gehts zur nächsten seite</a>';
    ?>

    jetzt der code von der xyz.php

    [CENTER]
    [/CENTER]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!