Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sessions inkonsistenz

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Sessions inkonsistenz

    Hallo,

    ich erlebe gerade eine gewisse inkonsistenz bei PHP Sessions.

    Ausgangspunkt sind 2 Scripte,

    Script 1 hat diesen Stil

    PHP-Code:
    <?
    if ($_SESSION['login'] == 'true' && $_SESSION['uid'] > 0) {
      db_query(//ein paar DB Abfragen);
      $_SESSION['new']='ok';
    }else {
      db_query(//ein paar andere DB Abfragen);
      $_SESSION['new']='nook';
    }
    ?>
    <html>
    <head>
    <body>
    <iframe src="script2.php"></iframe>
    </body>
    </html>
    Script 2 hat diesen Inhalt:
    PHP-Code:
    <?
    echo $_SESSION['new'];
    if($_SESSION['new']=='ok') {
      db_query(//ein paar DB Anfragen)
      $_SESSION['new']='nook1';
    ?>
    <html><head></head><body>Bisschen Text</body</html>
    <?
    }
    ?>
    Die beiden Scripte arbeiten zu ~80-90% ohne Probleme. Aber 10-20% der Aufrufe lassen Script 2 nur 'nook1' ausgeben.


    Wenn ich Script2 abänder zu
    PHP-Code:
    <?
    echo $_SESSION['new'];
    if($_SESSION['new']!='ok') { die(); }
      db_query(//ein paar DB Anfragen)
      $_SESSION['new']='nook1';
    ?>
    <html><head></head><body>Bisschen Text</body</html>
    <?
    //}
    ?>
    wird die(); nie aufgerufen, und das echo von $_SESSION['new'] ist immer 'ok', die inkonsistenz ist weg.

    Jemand eine Idee woran das liegt?

    Grüße
    Sebastian

  • #2
    Ich glaube du musst etwas deutlicher werden worin dein Problem besteht. Ist es absicht das nirgends sein session_start() zu sehen ist?

    Kommentar


    • #3
      Kann so nicht stimmen, wie du es erzählst. Angenommen, $_SESSION['new'] ist 'ok' und ich rufe dein abgeändertes Script2 zweimal in Folge auf, dann müsste beim zweiten Aufruf definitiv nook1 ausgegeben werden, da die() nicht aufgerufen wird und $_SESSION['new']='nook1'; auf jeden Fall. Entweder hast du also irgendwo noch Seiteneffekte oder du erklärst besser erstmal was du da überhaupt machst.
      [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
      [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

      Kommentar


      • #4
        ja natürlich ist das absicht.
        auf $_SESSION['new'] wird sonst nirgendwo zugegriffen,
        beide dateien haben includen eine session.lib.php in der die session gestartet wird.

        Oh grad erst das 2. Reply gesehen, moment.

        Kommentar


        • #5
          Hier die beiden Scripte im vollen.
          $_SESSION['betau_newbetau'] ist die $_SESSION['new'] in der es in meinem Codeschnipsel oben ging.
          Im code sind ein paar echo's die mir als debug-Nachrichten dienen.

          Script 1
          PHP-Code:
          <? ?>
          Script 2:
          PHP-Code:
          <?  ?>
          fab, du hast recht, gerade ist diese Inkonsistenz tritt auch nach der Abänderung auf (hat nur länger gedauert).

          Wenn der Fehler auftritt, steht im Hauptframe cool und im iframe nook1.
          Wenn der Fehler nicht auftritt, steht im Hauptframe cool und im iframe ok.

          Kommentar


          • #6
            Kann es sein das deine Bedingungen im ersten Script zum setzen auf "ok" einfach nicht immer zutreffen und somit nichts gesetzt wird und der damit der alte wert "nook1" drin bleibt?

            Kommentar


            • #7
              das hatte ich auch zuerst überlegt,
              darum habe ich im ersten script das "echo 'cool';" drin, das wird auch ausgegeben, daher muss die bedingung ja erfüllt sein und $_SESSION['betau_newbetau']='ok'; ist wenige Zeilen darüber in derselben Bedingung.

              Nachtrag:
              Dazu kommt noch, das die Bedingung ja ein
              else{ $_SESSION['betau_newbetau']='nook';
              hat.
              Wenn die Bedingung also nicht zutrifft müsste $_SESSION['betau_newbetau'] mit 'nook' gefüllt sein und nicht mit 'nook1'

              Kommentar


              • #8
                Zitat von cbug Beitrag anzeigen
                Nachtrag:
                Dazu kommt noch, das die Bedingung ja ein
                else{ $_SESSION['betau_newbetau']='nook';
                hat.
                Wenn die Bedingung also nicht zutrifft müsste $_SESSION['betau_newbetau'] mit 'nook' gefüllt sein und nicht mit 'nook1'
                Stimmt nicht. Nur wenn

                if (mysqli_num_rows($forcedbanner) > 0) {

                nicht zutrifft wird "nook" gesetzt.

                Trifft aber
                if (!isset($_SESSION['window']) || $_SESSION['window'] <= $time) {
                oder
                if ($_SESSION['login'] == 'true' && $_SESSION['uid'] > 0) {

                nicht zu, so wird an der Variable nichts verändert.

                Kommentar


                • #9
                  Dann würde aber trotzdem echo 'cool'; nicht ausgegeben werden.

                  Kommentar


                  • #10
                    Ok ich hab da eine Theorie die auch den "Zufallsfaktor" erklären würde:

                    Öffne ich deine Seite und klicke auf "refresh" wenn der iframe noch nicht zuende geladen hat, dann läuft script1 nochmal und setzt "ok" das script 2 vom ersten aufruf läuft aber im hintergrund noch zu ende und setzt "nook1", dann kommt script 2 vom 2ten aufruf und gibt "nook1" aus was kurz vorher gesetzt wurde.

                    wie gesagt es ist nur eine THEORIE

                    Kommentar


                    • #11
                      Deine Theorie ist sehr gut möglich,

                      aber das script läuft im Moment nur in meiner eigenen Testumgebung, es gibt niemanden der da "reloaded" ausser der browser läd die Seiten von alleine doppelt.

                      Und da wär ja dann die Frage, warum er das tut.
                      Bzw. nicht nur 'er' das ganze tritt mit dem IE8 und dem aktuellen FF mit und ohne noscript auf.

                      Mal wieder ein Nachtrag:
                      Ich habe mal print_r($_SESSION) und print_r($_GET) drüber gesetzt.
                      Wenns abbricht ist $_GET['auszahlen'] => 'true'

                      Code:
                      Cool
                      1282133634nook1
                      Array ( [login] => true [werber] => 0 [uid] => 2 [passwort] => /*ausgext */ [betau_newbetau] => nook1 [betau_bid] => ec5dae4c0d64806929b3dc3a6de0a328 [betau_sektimer] => 5 [window] => 1282133631 [ziel] => http://www.somesite.de/)
                      Array ( [auszahlen] => true [tan] => ec5dae4c0d64806929b3dc3a6de0a328 [logout] => [ref] => 0 )

                      Kommentar


                      • #12
                        Also hast du die beiden Scripte immer zuende laden lassen und der Fehler ist trotzdem aufgetreten?

                        Kommentar


                        • #13
                          Kurz und knapp:
                          Japp.

                          Ich interagiere bis auf den Initialen Aufruf des ersten Scriptes garnicht.

                          Kommentar


                          • #14
                            mach doch einfach mal ein var_dump($_SESSION) vorm laden des iframes und eines als erstes innerhal des iframes

                            Kommentar


                            • #15
                              Die Ursache Deines Problems ist der iframe und nicht eine etwaige Inkonsistenz des PHP Sessionhandlings.

                              Dein Skript im iframe hat "seine eigene" Session. Nur weil man die Frames nicht mehr "sieht", heißt das noch lange nicht, dass ein iframe anders funktioniert als ein frame. Und auch hier gilt dann genauso: Frames stinken!

                              Wie dem auch sei...

                              Lösung:

                              Du musst Die Session-ID per GET-Parameter an den iframe übergeben und damit im "gerahmten" Skript die Session initialisieren.

                              HF & GL

                              Kommentar

                              Lädt...
                              X