Session weiternutzen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Session weiternutzen

    Habe das Problem, das ich meine seite jetzt auf php umgestellt habe, folglich mit sessions arbeite für die einzelnen unterseiten, von denen eine auch ein gästebuch(captcha), was ebenfalls mit sessions arbeitet, eine eigene funktion session_start() hat und im früheren frameset auch funktioniert hat.

    jetzt bekomme ich die meldung session_error, den die session die das gästebuch starten will ist bereits gestartet.
    Wie schreibe ich den gästebuchscript:
    PHP-Code:


    <?php

    error_reporting
    (E_ALL);
        
    session_start();

        
    $CAPTCHA_RandomText "";
        if (isset(
    $_POST['txtCode'])){
        
    $CAPTCHA_EnteredText $_POST['txtCode'];
        }
        if (isset(
    $_SESSION['CAPTCHA_RndText'])) {
        
    $CAPTCHA_RandomText $_SESSION['CAPTCHA_RndText'];
        }

        if (
    $CAPTCHA_EnteredText == $CAPTCHA_RandomText)
        {
    [...(
    unwichter Code zum überrpüfen der angaben und eintragen des eintrag)...]

    }
    // Session unset und destroy
        
    session_unset();
        
    session_destroy();
    ?>


    in einer captcha_img.php wird ebenfalls session_start() aufgerufen
    so um, das er die vorhande session mit nutzt.?

  • #2
    Re: Session weiternutzen

    Original geschrieben von Dark^Listener jetzt bekomme ich die meldung session_error, den die session die das gästebuch starten will ist bereits gestartet.
    wie wärs denn, wenn du session_start() einfach aus dem gästebuchscript entfernst?

    Kommentar


    • #3
      ich würde session_id() abfragen, weil session_start() seit php 4.x.x eine Fehlermeldung bringt, wenn 2x aufgerufen.

      session_id() returns the session id for the current session or the empty string ("") if there is no current session (no current session id exists).

      ausserdem würde ich mit session_destroy vorsichtig sein. Viel besser ist es, einfach die eigenen Variabeln in $_SESSION mit unset() zu löschen: unset($_SESSION['gb_variable']); oder gerade einen Unterarray für die gb-Variabeln zu machen und in $_SESSION einzutragen.

      session_unset() sollte nicht verwendet werden iZsh mit $_SESSION.

      Mir scheint, mit diesen Grundsätzen wird es funktionieren.

      Kommentar


      • #4
        PHP-Code:
        if(!session_id())
         
        session_start(); 
        das ist natürlich flexibler, falls er wieder auf ein frameset umstellt.

        Kommentar


        • #5
          Original geschrieben von 3DMax
          PHP-Code:
          if(!session_id())
           
          session_start(); 
          das ist natürlich flexibler, falls er wieder auf ein frameset umstellt.
          Das hat nun wirklich nix mit Frames zu tun.....
          Mit "fremden" includes oder so, kann ich es verstehen..
          (und ist auch richtig so)
          Wir werden alle sterben

          Kommentar


          • #6
            Original geschrieben von combie
            Das hat nun wirklich nix mit Frames zu tun.....
            wieso nicht?
            es kann doch in jedem frame eine eigene session laufen.

            Kommentar


            • #7
              Angenommen alle Frames werden vom dem selben Sever oder Website beliefert..

              Wenn die SID per URL übergeben wird... dann ja... mag möglich sein..
              Bei den Standard-Session-Cookie-Einstellungen gilt eine Session für alle Frames!

              Aber das hat auch wiederrum absolut nix mit dem if-Konstukt zu tun...
              Damit ist nur festzulegen, daß wirklich nur 1 mal session_start() pro Request ausgeführt wird!
              (oder sollte ich mich da ganz fürchterlich vertun)
              Zuletzt geändert von combie; 31.08.2006, 00:35.
              Wir werden alle sterben

              Kommentar


              • #8
                Original geschrieben von combie Wenn die SID per URL übergeben wird... dann ja... mag möglich sein..
                Bei den Standard-Session-Cookie-Einstellungen gilt eine Session für alle Frames!
                ich behaupte mal das gegenteil, bin jetzt aber zu faul, das zu testen
                im falle von session.use_trans_sid wird die sid automatisch an frame=src geklebt und session-cookies werden für jedes frame separat gesetzt.

                Aber das hat auch wiederrum absolut nix mit dem if-Konstukt zu tun...
                Damit ist nur festzulegen, daß wirklich nur 1 mal session_start() pro Request ausgeführt wird!
                ja, genau bzw. auch pro frame, weil dann, meiner meinung nach, das session-cokkie nicht aktiv ist.

                [edit]
                die übertragung ist eigentlich egal - in jedem frame muss auf alle fälle session_start() erfolgen. werde das morgen vielleicht mal testen.
                Zuletzt geändert von 3DMax; 31.08.2006, 00:52.

                Kommentar


                • #9
                  und session-cookies werden für jedes frame separat gesetzt.
                  Ebend nicht!
                  http://de2.php.net/manual/de/functio...rite-close.php
                  Sagt:
                  ...... Bei der Verwendung von Framesets zusammen mit Sessions werden Sie merken, dass wegen dieser Sperrung ein Frame nach dem anderen geladen wird. Sie können die Zeit zum Laden aller Frames reduzieren, indem Sie die Session beenden, sobald alle Änderungen an den Session-Variablen durchgeführt sind.
                  Warum wohl?
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    Warum wohl?
                    ich vermute mal, wenn in jedem frame die selbe session läuft (übergabe der sid im url).

                    Session State bei parallelen Browser-Frames und Fenstern:
                    Viele Browser, wie Microsoft Internet Explorer 4.x und 5.0, speichern einen temporären Cookie (wie den Session Cookie) im Speicher des Prozesses, der die Webseite gerade anzeigt. Bei einem Frameset wird jeder Frame von einem eigenen Prozeß verwaltet und daher hat auch jeder Frame seine eigenen temporären Cookies. So schickt auch der Webserver beim Aufruf mehrerer ASP Seiten im Frameset zu jeder ASP Seite einen eigenen Session Cookie mit und generiert für jede ASP Seite ein eigenes Session Objekt. Das ist der Grund dafür, daß man von einer ASP Seite des Framesets keinen Zugriff auf Session Variablen einer anderen ASP Seite des Framesets mehr hat. (Vergleiche auch MSDN Artikel "Session Variables Lost When ASP is Located in Frameset")
                    der artikel ist zwar nicht ganz aktuell und behandelt auch asp, aber die cookiebehandlung deckt sich mit meinen vorstellungen

                    Kommentar


                    • #11
                      Ich habe das mal getestet..
                      SID per Cookie...
                      egal welcher Browser: IE, FF, Opera

                      frame.php:
                      PHP-Code:
                      <?php  
                      session_start
                      ();  
                      echo 
                      session_id();  
                      ?>


                      Bei einer frameset.html:
                      PHP-Code:
                      <frameset rows="50%,50%">
                          <
                      frame src="frame.php" name="test1">
                          <
                      frame src="frame.php" name="test2">
                      </
                      frameset
                      Kann es passieren(muss aber nicht) das in jedem Frame eine eigene Session gestartet wird!
                      Beim ersten Reload einigen sich dann aber alle Frames auf die gleiche SID!
                      Scheint ein "race condition" Problem zu sein...


                      Bei einer frameset.php:
                      PHP-Code:
                      <?php session_start() ?>
                      <frameset rows="50%,50%">
                          <frame src="frame.php" name="test1">
                          <frame src="frame.php" name="test2">
                      </frameset>
                      Wird sofort in allen Frames die gleiche Session gestartet!
                      IMMER!

                      Resumee:
                      Alle Frames teilen sich ein Cookie!
                      Bei konkurierenden Zugriffen gewinnt das zuletzt gesetzte!
                      Ja, ich muss zugeben, es gibt ein Session-Frame-Problem.
                      Es ist aber in den Griff zu bekommen...


                      Test:
                      http://www.combie.de/frametest/frameset.html
                      http://www.combie.de/frametest/frameset.php
                      Zuletzt geändert von combie; 31.08.2006, 03:26.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Original geschrieben von combie
                        Resumee:
                        Alle Frames teilen sich ein Cookie!
                        Bei konkurierenden Zugriffen gewinnt das zuletzt gesetzte!
                        Na klar, es ist nur ein Cookie - sofern der Cookie-Name nicht geändert wird (Script/Konfiguration).

                        Ist doch alles ganz und gar logisch ...

                        Wenn in Frame1 eine Session gestartet wird, sendet der Server einen Cookie mit.
                        Wird Frame2 angefordert, bevor die Antwort für Frame1 da ist, hat der Client noch kein Cookie zum mitsenden - also startet der Server eine neue Session, und sendet unter dem gleichen Cookie-Namen eine neue SID zurück - die jetzt die "alte" SID von Frame1 ersetzt.

                        So, sind jetzt alle Frames geladen, bleibt irgendeine der übermittelten SIDs übrig - und wird bei der nächsten Anfrage, egal für welchen Frame, vom Client wieder an den Server geschickt.
                        Und in der Antwort schickt der Server genau diese SID erneut im Cookie mit, jetzt "bleibt" sie also, egal für welchen Frame.


                        Den im von 3DMax verlinkten Artikel beschriebenen Effekt würde ich als Browserfehler bezeichnen wollen. Cookies gehören per Definition zur Domain (und ggf. Pfad), von der aus sie gesetzt wurden, und nicht zu irgendwelchen "Prozessen" - weder HTTP, noch der Server interessieren sich dafür, ob clientseitig irgendwelche "Prozesse" vorhanden sind.
                        Der Cookie ist mit jedem Request zu übermitteln, der innerhalb dieser Domain/Pfad-Umgebung lokalisiert ist.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Original geschrieben von combie
                          Resumee:
                          Alle Frames teilen sich ein Cookie!
                          ja, da muss ich dir recht geben. habs auch mal mit dem ie5 getestet, selbes verhalten
                          da lag ich wohl verkehrt.

                          Original geschrieben von wahsaga
                          Der Cookie ist mit jedem Request zu übermitteln, der innerhalb dieser Domain/Pfad-Umgebung lokalisiert ist.
                          aber bei zwei geöffneten browser-instanzen habe ich doch auch zwei unterschiedliche session-cokies/session-ids innerhalb der selben domain.

                          Kommentar


                          • #14
                            Original geschrieben von 3DMax
                            aber bei zwei geöffneten browser-instanzen habe ich doch auch zwei unterschiedliche session-cokies/session-ids innerhalb der selben domain.
                            Ja, zwei Browserinstanzen sind ja auch etwas vollkommen unabhängiges.

                            Aber Frames werden in einer Browserinstanz angezeigt - und ob da noch verschiedene "Prozesse" hinter liegen, ist mir wurscht :-)
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Habe das mal mit den 3 oben genannten Browsern getestet...

                              Nur der IE gönnt sich für jede Instanz ein eigenes Cookie. FF und Opera arbeiten in allen geöffneten Fenstern mit ein und demselben Cookie.

                              -----------
                              Besten Dank für die anregende Disskusion...
                              auch ich habe noch was dazugelernt

                              Wahrscheinlich werde ich Fragmente, aus dem hier gesagten, in mein mini Tutorial übernehmen.
                              http://www.technischedaten.de/pmwiki...essionHandling
                              Wir werden alle sterben

                              Kommentar

                              Lädt...
                              X