Andreas: Probleme mit Sessions ohne Cookies

Hallo!
Schön das das hier alles wieder funktioniert!

Hab ein mehr oder weniger großes Problem mit Sessions, bzw. mit der Weitergabe der PHPSESSID.
Ich wollte bei einer neuen Seite diesmal ganz auf Session-Cookies verzichten, ich brauche die Session ID im Prinzip auch nur für den Warenkorb. Aber trotzdem funtioniert das dann ja nur, wenn ich an jeden Link die Session ID ranhänge. Das habe ich meines erachtens getan, aber irgendwie funktioniert das nicht immer 100%ig.
Erstmal grundsätzlich, reicht es, wenn ich auf dr Startseite einmal @session_start();
aufrufe? Wenn ich das so mache, habe ich doch erstmal noch keine SessionID, jedenfalls ist dann die Variable $PHPSESSID leer. Ich hatte auf allen anderen Seiten nämlich nichts mehr mit @session_start();
geschrieben und dann ging es nicht. Ich habe hauptsächlich ein Formular, in das ich ein verstecktes Feld mit dem Namen "SID" und dem Wert $PHPSESSID, über das die Navigation von der Startseite läuft. Ich habe extra einen anderen namen gewählt, den ich überall beibehalte, damit ich zu 100% von den Cookies loskomme, oder war das nicht so schlau?
Jedenfalls übertrage ich so auch die Session ID in allen Links, und von den anderen Seiten aus dann nur noch als SID.
Aber das alles funktioniert nur, wenn ich auf der 2. Seite auch die Session starte, was ich aber vermeiden wollte. Wenn ich die ID einmal in der Variable SID habe, geht alles wunderbar.

Kann mir jemand sagen ob ich einen Denkfehler mache, oder warum das nicht so klappt, wie ich mir das vorstelle?

Vor allem, warum habe ich auf der 1. Seite keine Session ID, ich meine das weiß der Server ja schon vorher und schickt mir die Seite, warum nicht auch mit SessionID?

Hoffe Ihr könnt mir Helfen!

Vielen Dank im voraus

Andreas

  1. Hallo!
    Schön das das hier alles wieder funktioniert!

    Hab ein mehr oder weniger großes Problem mit Sessions, bzw. mit der Weitergabe der PHPSESSID.
    Ich wollte bei einer neuen Seite diesmal ganz auf Session-Cookies verzichten, ich brauche die Session ID im Prinzip auch nur für den Warenkorb. Aber trotzdem funtioniert das dann ja nur, wenn ich an jeden Link die Session ID ranhänge. Das habe ich meines erachtens

  2. Hallo Andreas,

    Schön das das hier alles wieder funktioniert!

    Das finde ich auch!

    Hab ein mehr oder weniger großes Problem mit Sessions, bzw. mit der Weitergabe der PHPSESSID.

    Erstmal grundsätzlich, reicht es, wenn ich auf dr Startseite einmal @session_start();
    aufrufe? Wenn ich das so mache, habe ich doch erstmal noch keine SessionID, jedenfalls ist dann die Variable $PHPSESSID leer.

    Ich bin mir nicht ganz sicher, aber diese Variable $PHPSESSID oder SID oder wie auch immer, hängt mit einer PHP-ini-Option namens trans-sid zusammen. Das heißt, wenn trans_sid enabled ist in der php.ini dann ist wohl auch die Variable von PHP automatisch mit der id belegt.
    Sehr wahrscheinlich ist diese option aber auf den meißten Servern im Web nicht enabled (prüfs bei dir mal mit php_info), deshalb solltest Du evtl ganz darauf verzichten.

    Nachdem Du deine Session gestartet hast, kannst Du mit
    session_id() den Wert abfragen.

    Hoffe es hilft Dir,
    Horst

    1. Hallo!

      Ich bin mir nicht ganz sicher, aber diese Variable $PHPSESSID oder SID oder wie auch immer, hängt mit einer PHP-ini-Option namens trans-sid zusammen. Das heißt, wenn trans_sid enabled ist in der php.ini dann ist wohl auch die Variable von PHP automatisch mit der id belegt.

      Nein, wenn PHP mit  --enable-trans-sid installiert wurde, braucht man die Konstate SID nicht einsetzen. Sobald Cookies deaktiviert sind, versieht der PHP-Parser alle relativen Links mit dem Session-Name und Session-ID.
      session.use_trans_sid steht in der php.ini immer mit true|1, egal ob man es mit --enable-trans-sid  installiert hat. Wurde es nichts installiert, geht es halt nicht. Wurde es installiert, kann man es noch deaktivieren(fale|0).

      SID ist eine Konstate, die einfach nur die Session-Name/Varibale=Session-ID schreibt. Die kommt aber auch nur zum einsatz, wenn Cookies deaktiviert sind.

      Sehr wahrscheinlich ist diese option aber auf den meißten Servern im Web nicht enabled (prüfs bei dir mal mit php_info), deshalb solltest Du evtl ganz darauf verzichten.

      Aus Performancegründen wird es auf nicht mit installiert.

      Nachdem Du deine Session gestartet hast, kannst Du mit
      session_id() den Wert abfragen.

      Es reicht auch ein session_register(), wenn man gleich Variablen registriert.

      MfG, André Laugks

      1. Hi!
        Bei mir steht

        session.use_trans_sid  mit dem Wert "1".

        Heißt soweit ich weiß dass enabled ist, oder?

        Von wegen Performance - würdest Du das jetzt nutzen, oder lieber selbst überall Variable an die Links hängen?

        Aber was soll ich mit  session_register(), ich brauche ja lediglich eine ID, um die User eindeutig identifizieren zu können, vor allem für den Warenkorb. Dafür bietet sich die Session ID nun mal an. Ich will ja keine Variable in der Session speichern.

        session_start() sollte dafür doch genügen, nur wieso habe ich dann in PHPSESSID noch keinen Wert, wenn ich nur session_start() ausführe, also wieso habe ich noch keine SessionID?

        Grüsse
        Andreas

        1. Hi!

          Bei mir steht

          session.use_trans_sid  mit dem Wert "1".

          Heißt soweit ich weiß dass enabled ist, oder?

          Von wegen Performance - würdest Du das jetzt nutzen, oder lieber selbst überall Variable an die Links hängen?

          Aber was soll ich mit  session_register(), ich brauche ja lediglich eine ID, um die User eindeutig identifizieren zu können, vor allem für den Warenkorb. Dafür bietet sich die Session ID nun mal an. Ich will ja keine Variable in der Session speichern.

          Das habe ich geschrieben?

          ------------><8---------------------

          Es reicht auch ein session_register(), wenn man gleich Variablen registriert.

          ------------><8---------------------

          Es reicht also bei session_start().

          session_start() sollte dafür doch genügen, nur wieso habe ich dann in PHPSESSID noch keinen Wert, wenn ich nur session_start() ausführe, also wieso habe ich noch keine SessionID?

          echo "<a href="seite.phtml?PHPSESSID=" . $session_id() . ">";
          oder
          echo "<a href="seite.phtml?" . $sessin_name() . "=" . $session_id() . ">";
          oder
          echo "<a href="seite.phtml?" . SID . ">";

          PHPSESSID ist nichts anderes als eine Variable. Mit der Funktion session_name() kannst Du selbst einen Namen vergeben.

          session_name("neujahr");
          session_start();

          echo "<a href="seite.phtml?neujahr=" . $session_id() . ">";
          oder
          echo "<a href="seite.phtml?" . $sessin_name() . "=" . $session_id() . ">";
          oder
          echo "<a href="seite.phtml?" . SID . ">";

          MfG, André Laugks

          1. Hi!

            Leider funktioniert das nicht:

            echo "<a href="sess.php?PHPSESSID=" . $session_id() . ">";

            Fatal error: Call to undefined function: () in c:\apache\htdocs\sess.php on line 11

            Ist das jetzt automatisch gesetzt oder muß man $session_id() irgendwie erst definieren?

            So geht es:

            <a href="<? echo "$PHP_SELF$PHPSESSID"?>">PHPSESSID</a>

            Aber das verstehe ich  nicht, im Quelltext der ausgegebenen Seite steht da dann alles ordnungsgemäß.

            Genau so wie <input type="hidden" name="<? echo "$PHPSESSID" ?>">
            Irgendwie, fast egal ob ich das als name, oder value schreibe macht der immer das richtige daraus, nur immer als PHPSESSID.

            Ich glaube ist stelle lieber alles auf PHPSESSID um, das ist einfacher, und das mit Cookies ausschalten geht auch gut. Nur schade das ich auf der Startseite zum verrecken nicht an die SESSION ID als Variable selbst komme.

            1. Hallo!

              Leider funktioniert das nicht:

              echo "<a href="sess.php?PHPSESSID=" . $session_id() . ">";

              Fatal error: Call to undefined function: () in c:\apache\htdocs\sess.php on line 11

              Wenn Du Dir mal bei php.net die Session-Funktionen angeschaut hättest, wäre Dir aufgefallen, daß ich dort einem Tipp/Formfehler habe, den ich über Copie/Past mitgeschleppt habe.

              echo "<a href="sess.php?PHPSESSID=" . session_id() . ">";

              Ist das jetzt automatisch gesetzt oder muß man $session_id() irgendwie erst definieren?

              Die genneriert PHP für Dich und kannst sie mit session_id() ermittel.

              $session_id = session_id();

              So geht es:

              <a href="<? echo "$PHP_SELF$PHPSESSID"?>">PHPSESSID</a>

              Aber das verstehe ich  nicht, im Quelltext der ausgegebenen Seite steht da dann alles ordnungsgemäß.

              Genau so wie <input type="hidden" name="<? echo "$PHPSESSID" ?>">
              Irgendwie, fast egal ob ich das als name, oder value schreibe macht der immer das richtige daraus, nur immer als PHPSESSID.

              Hääää?

              In $PHPSESSID ist die Session_id gespeichert. Bei mir kommt da sowas raus, was auch logisch ist: datei.phtmldf38cb9055bc8658ed925299cd03cd88

              Das sollte wohl alles so aussehen:

              <a href="<? echo $PHP_SELF ?>?<?PHP echo session_name() . "=" . session_id();  ?>">link</a>

              <input type="hidden" name="<?PHP echo session_name(); ?>" value="<? echo session_id(); ?>">

              Oder Du verwendest die Konstante SID.

              Ich glaube ist stelle lieber alles auf PHPSESSID um, das ist einfacher, und das mit Cookies ausschalten geht auch gut.

              Du kannst mit session_name('variable') Dir einen eigenen Sessionname bzw. Sessionvariable schaffen. An die kommts Du über session_name() ran.

              $session_name = session_name();

              Nur schade das ich auf der Startseite zum verrecken nicht an die SESSION ID als Variable selbst komme.

              Programmierfehler und sicherlich auch ein Denkfehler von Dir!

              startseite.phtml

              <?PHP
              session_start()
              ?>
              <html>
              <body>

              echo "<a href="seite.phtml?" . session_name() . "=" . session_id() . "">";

              </body>
              </html>

              MfG, André Laugks

              1. echo "<a href="sess.php?PHPSESSID=" . session_id() . ">";

                oder:

                echo "<a href="sess.php?PHPSESSID=" . $PHPSESSID . ">";

                oder:

                session_name("sessid");
                session_start();

                echo "<a href="sess.php?sessid=" . $sessid . ">";
                echo "<a href="sess.php?<?PHP echo session_name() . "=" . $sessid . ">";
                echo "<a href="sess.php?<?PHP echo session_name() . "=" . session_id() . ">";

                Mir fallen da jetzt noch 1000 andere Möglichkeiten ein.

                MfG, André Laugks

  3. Hallo!

    Schön das das hier alles wieder funktioniert!

    Das kann ich mir vorstellen! ;-)

    Hab ein mehr oder weniger großes Problem mit Sessions, bzw. mit der Weitergabe der PHPSESSID.
    Ich wollte bei einer neuen Seite diesmal ganz auf Session-Cookies verzichten, ich brauche die Session ID im Prinzip auch nur für den Warenkorb. Aber trotzdem funtioniert das dann ja nur, wenn ich an jeden Link die Session ID ranhänge. Das habe ich meines erachtens getan, aber irgendwie funktioniert das nicht immer 100%ig. ...

    Mensch Junge, schaust Du wenigstens einmal in die Doku oder bemühst die Suche(n).
    Ich habe Forum ich schon ganze Aufsätze zu den Sessions geschrieben.

    http://forum.de.selfhtml.org/archiv/2001/7/26734/
    http://forum.de.selfhtml.org/archiv/2001/6/24858/
    http://forum.de.selfhtml.org/archiv/2001/6/25227/

    In der FAQ vom Herrn Prof. Dr.PHP Koehntopp gibt es auch ein ganz langes Kapitel, PHP4 und Sessions.

    Erstmal grundsätzlich, reicht es, wenn ich auf dr Startseite einmal @session_start();
    aufrufe? Wenn ich das so mache, habe ich doch erstmal noch keine SessionID, jedenfalls ist dann die Variable $PHPSESSID leer. Ich hatte auf allen anderen Seiten nämlich nichts mehr mit @session_start();
    geschrieben und dann ging es nicht. Ich habe hauptsächlich ein Formular, in das ich ein verstecktes Feld mit dem Namen "SID" und dem Wert $PHPSESSID, über das die Navigation von der Startseite läuft. Ich habe extra einen anderen namen gewählt, den ich überall beibehalte, damit ich zu 100% von den Cookies loskomme, oder war das nicht so schlau?

    Da kammst Du die Sessionvariable jeden Namen geben, Du mußt diese Option deaktivieren.

    ini_set("session.use_cookies", "off");

    Das scheibst Du in die erste Zeile Deiner Seiten, als aller erstes. Weil Du sicherlich kein Zugriff auf die php.ini hast, kannst Du mit dieser Funktion Einfluß nehmen.

    Jedenfalls übertrage ich so auch die Session ID in allen Links, und von den anderen Seiten aus dann nur noch als SID.
    Aber das alles funktioniert nur, wenn ich auf der 2. Seite auch die Session starte, was ich aber vermeiden wollte. Wenn ich die ID einmal in der Variable SID habe, geht alles wunderbar.

    Du bist doch bei Schlund? Du übersetzten PHP mit --use-trans-sid, dann hängt der PHP-Parser an jeden relativen Link die "Session-Daten"(Name+ID). Ich weiss auf alle Fälle bei den ganz großen Paketen.

    Kann mir jemand sagen ob ich einen Denkfehler mache, oder warum das nicht so klappt, wie ich mir das vorstelle?

    Vor allem, warum habe ich auf der 1. Seite keine Session ID, ich meine das weiß der Server ja schon vorher und schickt mir die Seite, warum nicht auch mit SessionID?

    Woher soll die 2. Seite die Session-ID bekannt sein, wenn Du ihr sie nicht mitteilst?

    MfG, André Laugks

    1. Hi!

      Mensch Junge, schaust Du wenigstens einmal in die Doku oder bemühst die Suche(n).
      Ich habe Forum ich schon ganze Aufsätze zu den Sessions geschrieben.

      Ich habe wohl schon was über Sessions gelesen, auch das von dir besagte.

      Da kammst Du die Sessionvariable jeden Namen geben, Du mußt diese Option deaktivieren.

      ini_set("session.use_cookies", "off");

      Das scheibst Du in die erste Zeile Deiner Seiten, als aller erstes. Weil Du sicherlich kein Zugriff auf die php.ini hast, kannst Du mit dieser Funktion Einfluß nehmen.

      Danke, dann werden also keine Cookies geschrieben. Aber am Anfang hat die Variable (solange ich das in der ini nicht ändern kann) ja den Namen PHPSESSID.

      Du bist doch bei Schlund? Du übersetzten PHP mit --use-trans-sid, dann hängt der PHP-Parser an jeden relativen Link die "Session-Daten"(Name+ID). Ich weiss auf alle Fälle bei den ganz großen Paketen.

      Ja, aber diese Seite leider nicht.

      Woher soll die 2. Seite die Session-ID bekannt sein, wenn Du ihr sie nicht mitteilst?

      Ja, das ist ja das Problem, wie soll ich die denn mitteilen, wenn ich die in der ersten Seite nichtmal anzeigen kann?

      Gruß
      Andreas

      1. Hallo!

        Ich habe wohl schon was über Sessions gelesen, auch das von dir besagte.

        Seteht aber alles in meinen "Aufsätzen".

        Danke, dann werden also keine Cookies geschrieben. Aber am Anfang hat die Variable (solange ich das in der ini nicht ändern kann) ja den Namen PHPSESSID.

        Den kannst Du mit session_name() ändern.

        Ja, aber diese Seite leider nicht.

        Dann bleibt Dir nur SID oder mit session_name() und session_id() es an die Links zu hängen.

        Ja, das ist ja das Problem, wie soll ich die denn mitteilen, wenn ich die in der ersten Seite nichtmal anzeigen kann?

        Programmierfehler!

        MfG, André Laugks

  4. Hallo!

    Wahrscheinlich ist es schon etwas spät aber irgendwie reden wir glaub ich ein bisschen aneinander vorbei. Folgendes ist mir gerade selbst aufgefallen:

    Folgendes Script habe ich gestestet:

    <?
    ini_set("session.use_cookies", "off");
    #session_name("SID");
    session_start();
    echo "SID $SID<br>";
    echo "PHPSESSID $PHPSESSID";
    ?> <a href="<? echo "$PHP_SELF$PHPSESSID"?>">link</a>

    Das komische daran, wenn ich es zum ersten mal aufrufe, steht da nichts bei echo "PHPSESSID $PHPSESSID";

    Wenn Cookies aktiviert sind steht nach einmal aktualisieren(!) die Session ID an der entsprechenden Stelle.

    Wenn nicht kann ich aktualisieren wie ich will, nichts passiert, klar. Nur seltsam ist, dass ich in der Statusleiste in dem Link die SessionID sehe, aber halt nicht bei echo...
    Und wenn ich diesen klicke erscheint die Session auch als "echo".

    Ursprünglich hatte ich den Link so vor:

    <a href="<? echo "$PHP_SELF?SID=$PHPSESSID"?>">link</a>

    Aber statt nur die ID anzuzeigen, steht im Link für $PHPSESSID

    PHPSESSID=312j213jpowqkü023pökeölk...

    Wer kann mir das erklähren? Oder hast Du (Andre) das schon? Ich meine so funktioniert das ganze sehr viel einfacher.

    Leider habe ich auf meiner Seite das Problem, dass das mal so wie oben, aber auch manchmal so wie von mir gedacht funktioniert, ich habe keinen Schimmer, wie das funktioniert. Möglicherweise hat das damit zu tun, das ich cookies nicht deaktiviert habe und
    auch zwischen durch(bis jetzt sicherheitshalber) session_start() verwende?

    Und ich habe mir gerade nochmal die Sachen dazu in den FAQ durchgelesen, steht wirklich vieles von dem drin, worüber Ihr geschrieben habt, aber diese Frage konnte ich mir da auch nicht beantworten.

    So wie ich das im Augenblick sehe, muß ich das auf der Startseite, da wo session_start() steht so machen wie oben in einem Script, und ab da habe ich dann die SessionID in einer richtigen Variable stehen, die ich dann überall verwenden kann, sehe ich das richtig? Also brauche ich doch nur einmal

    Session_start()und

    ini_set("session.use_cookies", "off");

    nämlich direkt am Anfang, oder?

    Grüsse

    Andreas