Mief: $_SESSION wird nach header("Location: ...") gelöscht

Hallo Leute,
ich hab gegooglt und gegooglt, bin aber zu keinem brauchbaren Ergebnis gekommen:

  
session_start();  
...  
$user_data=simplexml_load_file($t1."/admin/data/user.xml");  
$_SESSION["user_name"]=$user_data->user[$i]["user_name"];  
header("Location: admin/index.php");  

Wenn ich dann auf der Zielseite $_SESSION ausgebe, kommt folgende Ausgabe: "Array ()".
Wenn ich auf der ersten Seite anstatt des header-Befehls das Array ausgebe, kommt folgende Ausgabe:
Array ( [user_name] => SimpleXMLElement Object ( [0] => Test-User ) )

Wie kann es sein, dass die Session einfach gelöscht wird? Und: Ja, ich starte die Session auch auf der zweiten Seite!!!

  1. Wenn ich dann auf der Zielseite $_SESSION ausgebe, kommt folgende Ausgabe: "Array ()".

    Hast Du vorher (auf der Zielseite) session_start() ausgeführt oder session.auto_start auf On konfiguriert? Ansonsten sollte wenigstens eine (neue) Session-Id vergeben worden sein. Der leere Array ist ein Hinweis darauf, dass keine Session gestartet wurde.

    Jörg Reinholz

    1. Soll ich mich jetzt selbst zitieren? Ich hab doch sogar extra dabei geschrieben, dass ich auf der Zielseite session_start() gemacht habe.

      1. Soll ich mich jetzt selbst zitieren? Ich hab doch sogar extra dabei geschrieben, dass ich auf der Zielseite session_start() gemacht habe.

        Ok. Ok. Dann versuche es mal statt header('Location: admin/index.php') damit:

          
        
        > session_start();  
        > ...  
        > $user_data=simplexml_load_file($t1."/admin/data/user.xml");  
        > $_SESSION["user_name"]=$user_data->user[$i]["user_name"];  
        
        echo '  
        <html>  
           <head>  
             <meta http-equiv="refresh" content="0; URL="admin/index.php" />  
             <meta name="robots" content="noindex, nofollow" />  
           </head>  
           <body>  
              Weiterleitung zum <a href="admin/index.php">Administrationsbereich</a>  
           </body>  
        </html>  
        ';  
        
        

        Jörg Reinholz

        1. Soll ich mich jetzt selbst zitieren? Ich hab doch sogar extra dabei geschrieben, dass ich auf der Zielseite session_start() gemacht habe.

          Ok. Ok. Dann versuche es mal statt header('Location: admin/index.php') damit:

          session_start();
          ...
          $user_data=simplexml_load_file($t1."/admin/data/user.xml");
          $_SESSION["user_name"]=$user_data->user[$i]["user_name"];
          echo '
          <html>
             <head>
               <meta http-equiv="refresh" content="0; URL="admin/index.php" />
               <meta name="robots" content="noindex, nofollow" />
             </head>
             <body>
                Weiterleitung zum <a href="admin/index.php">Administrationsbereich</a>
             </body>
          </html>
          ';

          
          >   
          > [Jörg Reinholz](http://www.fastix.org)  
            
          Das wär ne Möglichkeit. Allerdings gibt es dabei ein kleines Problem:  
          Ich hab eine Seite mit einem Anmeldeformular, beim Absenden ruft sich die Seite selbst auf und verarbeitet die Daten dann. Deshalb ist diese Methode leider etwas ungünstig. Wenn es allerdings nicht anders geht, werde ich das System wohl oder übel umstellen müssen. Aber trotzdem Danke.
          
          1. Das wär ne Möglichkeit. Allerdings gibt es dabei ein kleines Problem:
            Ich hab eine Seite mit einem Anmeldeformular, beim Absenden ruft sich die Seite selbst auf und verarbeitet die Daten dann. Deshalb ist diese Methode leider etwas ungünstig. Wenn es allerdings nicht anders geht, werde ich das System wohl oder übel umstellen müssen. Aber trotzdem Danke.

            Ob Du jetzt header('Location: ...') sendest oder die HTML-Umleitung sollte in der Hinsicht ziemlich egal sein. Nach header('Location: ...') sollte von PHP eigentlich nichts mehr gemacht werden, als womöglich genau das, was ich vorgeschlagen habe(*) gesendet werden, weil der Client ja schon zur nächsten Seite eilt.

            *) Es soll Browser geben, die auf Grund einer Nutzerkonfiguration eine automatische Umleitung verweigern.

            Jörg Reinholz

          2. Soll ich mich jetzt selbst zitieren? Ich hab doch sogar extra dabei geschrieben, dass ich auf der Zielseite session_start() gemacht habe.

            Ok. Ok. Dann versuche es mal statt header('Location: admin/index.php') damit:

            session_start();
            ...
            $user_data=simplexml_load_file($t1."/admin/data/user.xml");
            $_SESSION["user_name"]=$user_data->user[$i]["user_name"];
            echo '
            <html>
               <head>
                 <meta http-equiv="refresh" content="0; URL="admin/index.php" />
                 <meta name="robots" content="noindex, nofollow" />
               </head>
               <body>
                  Weiterleitung zum <a href="admin/index.php">Administrationsbereich</a>
               </body>
            </html>
            ';

            
            >   
            > [Jörg Reinholz](http://www.fastix.org)  
              
            Hab das mal testweise ausprobiert: Seltsamerweise das gleiche Problem.
            
            1. Hab das mal testweise ausprobiert: Seltsamerweise das gleiche Problem.

              Ein error_reporting(E_ALL) könnte hilfreich sein. (s. Deine zweite Frage).

              Jörg Reinholz

              1. Ein error_reporting(E_ALL) könnte hilfreich sein. (s. Deine zweite Frage).

                Irgendwo in diesem Thread hab ich geschrieben, das es ne Fehlermeldung gibt und diese dort auch gepostet. Musst wahrscheinlich ein bisschen suchen. :)

            2. Hab das mal testweise ausprobiert: Seltsamerweise das gleiche Problem.

              Schau mal nach, ob ein Session-Cookie überhaupt transportiert wird. Nutze dafür die Entwickler-Tools, Firebug oder wget -d

              Jörg Reinholz

              1. Schau mal nach, ob ein Session-Cookie überhaupt transportiert wird. Nutze dafür die Entwickler-Tools, Firebug oder wget -d

                Ja. Das hab ich hier in dem Thread auch irgendwo geschrieben.

      2. Ich poste einfach mal meinen ganzen Code:

        Nicht wundern!! Das ist beides die gleiche Datei!!

        PHP-Teil~~~php <?php
        session_start();
        $_SESSION = array();
        $t1=".";
        if(isset($_POST["name"]) && isset($_POST["passwort"])){
            $user_data=simplexml_load_file($t1."/admin/data/user.xml");

        for($i=0;$i<count($user_data->user);$i++){
                if($user_data->user[$i]["name"]==$_POST["name"]){
                    if(md5($_POST["passwort"])==$user_data->user[$i]["passwort"]){
                        $_SESSION["user_name"]=$user_data->user[$i]["user_name"];
                        header("Location: admin");
                    }else{
                        header("Location: ./");
                    }
                }
            }
        }
        ?>

        HTML-Teil~~~html
        <!DOCTYPE html>  
        <html>  
            <head>  
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
                <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />  
                <meta name="HandheldFriendly" content="True">  
                <meta name="MobileOptimized" content="320">  
                <meta http-equiv="cleartype" content="on">  
                <title>CMS - Login</title>  
            </head>  
            <body>  
                <h1>Login</h1>  
                <form method="post" action="./">  
                    <table border="0">  
                        <tr>  
                            <td>Name:</td><td><input type="text" name="name" /></td>  
                        </tr><tr>  
                            <td>Passwort:</td><td><input type="password" name="passwort" /></td>  
                        </tr>  
                        <tr>  
                            <td colspan="2"><button type="submit" style="width:100px">Login</button></td>  
                        </tr>  
                    </table>  
                </form>  
            </body>  
        </html>
        
        1. 
          > session_start();  
          
          $_SESSION = array();
          

          Die letzte Zeile plonkt die Session-ID

          Mach das weg.

          Jörg Reinholz

          1. Die letzte Zeile plonkt die Session-ID

            Ich weiß zwar trotz wikipedia nicht genau, was Planken heißt, aber ich weiß soviel, dass ich sagen kann, dass die Session-ID über die Cookies weitergegeben wird und das Funktioniert auch einwandfrei.

          2. Tach!

            $_SESSION = array();[/code]
            Die letzte Zeile plonkt die Session-ID

            Diese Zeile löscht nur die Nutzdaten der Session. An der SID ändert sich dabei gar nichts.

            dedlfix.

        2. Hallo,

          Ich poste einfach mal meinen ganzen Code:

          naja, alles wär nicht nötig gewesen, aber sei's drum.

          Nicht wundern!! Das ist beides die gleiche Datei!!

          Wieso sollte uns das wundern?

          <?php

          session_start();
          $_SESSION = array();

            
          HALT!!  
          Du startest eine Session, sorgst damit also dafür, dass  
           \* entweder eine vorhandene und identifizierbare Session wiederaufgenommen wird  
           \* oder eine neue Session angelegt wird.  
          Bis hierher klar.  
            
          Und dann löschst du das komplette $\_SESSION-Array und wunderst dich dann, dass die vorherigen Session-Daten weg sind? Also mich wundert das nicht ...  
            
          Ciao,  
           Martin  
          
          -- 
          Die junge Ehefrau weint sich bei ihrer Mutter aus:  
          Er hat gesagt, ich soll mich zum Teufel scheren! - Und da kommst du ausgerechnet zu mir?!  
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          
          1. Und dann löschst du das komplette $_SESSION-Array und wunderst dich dann, dass die vorherigen Session-Daten weg sind? Also mich wundert das nicht ...

            Erstens:
            Selbst HALT. Das hast du nur falsch verstanden. Das ist meine Login-Datei. Und soll das so sein. Das Session-Array wird ja erst später gefüllt und auf der Ziel-Seite wird das nicht gelöscht.

            Das mit dem Löschen ist lediglich ein kleiner Sicherheitsmechanismus. Übrigens: Selbst, wenn ich den Befehl auskommentiere (was ich auch schon vorher mal gemacht hatte) kommt der Fehler.

            Zweitens:
            Nach dem ich ein wenig mit meiner PHP.ini gespielt habe, sodass der mir Fehler ausgibt, kommt dieser Fehler (Ich hab mal den header dafür auskommentiert, also nach Eingabe von Name und Passwort):

            Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SimpleXMLElement' is not allowed' in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

            1. Tach!

              Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SimpleXMLElement' is not allowed' in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

              Na bitte. Du darfst kein SimpleXML-Objekt in der Session ablegen wollen. Stattdessen solltest du nur die skalaren Daten (oder andere Objekte und Arrays) verwenden. Für den Usernamen solltest du einen Typecast nach String verwenden. Prüf aber das Ergebnis mit einer var_dump()-Kontrollausgabe.

              dedlfix.

              1. Na bitte. Du darfst kein SimpleXML-Objekt in der Session ablegen wollen. Stattdessen solltest du nur die skalaren Daten (oder andere Objekte und Arrays) verwenden. Für den Usernamen solltest du einen Typecast nach String verwenden. Prüf aber das Ergebnis mit einer var_dump()-Kontrollausgabe.

                Warte wenn ich auf der Login-Seite das Sessioin Array ausgebe, kommt folgende ausgabe:

                Array ( [user_name] => SimpleXMLElement Object ( [0] => Test-User ) )

                (Kann erst morgen abends wieder antworten.)

                1. Tach!

                  Warte wenn ich auf der Login-Seite das Sessioin Array ausgebe, kommt folgende ausgabe:
                  Array ( [user_name] => SimpleXMLElement Object ( [0] => Test-User ) )

                  Mag sein, an der Stelle ist $_SESSION wohl noch im RAM. Erst zum Ende des Scripts wird es in die Session-Datei geschrieben und dabei beschwert sich das SimpleXMLElement, dass es nicht zu serialisieren geht. Dies ist auch irgendwie verständlich, denn ohne das zugehörige XML-Dokument ist es nicht mehr nutzbar.

                  Frage am Rande: Warum nimmst du XML zum Speichern? Das ist unnötig komplex zu warten. Das Ini-Format wäre einfacher zu pflegen.

                  dedlfix.

                  1. Frage am Rande: Warum nimmst du XML zum Speichern? Das ist unnötig komplex zu warten. Das Ini-Format wäre einfacher zu pflegen.

                    Doch noch mal da. :)
                    XML nehme ich, weil das meiner Meinung nach relativ einfach zu handhaben ist. Außerdem wüsste ich nicht, wie man das mit einer uni machen sollte.

                    Aber jetzt nochmal zu Thema zurück: Wie bekomme ich den Text aus dem SimpleXML-Objekt raus? Denn irgendwie müsste es ja gehen.

                    1. Tach!

                      XML nehme ich, weil das meiner Meinung nach relativ einfach zu handhaben ist. Außerdem wüsste ich nicht, wie man das mit einer uni machen sollte.

                      Das finde ich nicht. XML ist ein Format, bei dem man recht einfach Fehler einbauen kann, weil es recht komplex ist. Nimm zum Beispiel mal & als Sonderzeichen im Passwort. Das muss als &amp; notiert werden, sonst gibt es einen Parse-Fehler. Solche Regeln muss der Bearbeiter kennen. Das Ini-Format ist dagegen vergleichsweise unaufregend.

                      Aber jetzt nochmal zu Thema zurück: Wie bekomme ich den Text aus dem SimpleXML-Objekt raus? Denn irgendwie müsste es ja gehen.

                      Sagte ich doch schon: Typecast zu String. Wenn man ein SimeleXMLElement-Objekt in einen String-Kontext bringt, bleibt nur noch der reine Wert übrig (siehe Handbuch). (Mit parse_ini_file() hat man die Probleme nicht, das liefert "ordentliche" Werte zurück.)

                      dedlfix.

                      1. Aber jetzt nochmal zu Thema zurück: Wie bekomme ich den Text aus dem SimpleXML-Objekt raus? Denn irgendwie müsste es ja gehen.

                        Sagte ich doch schon: Typecast zu String.

                        Ich wollte nicht wissen auf welche Art, sondern WIE das geht. Hab dann beim googlen die Funktion strval() gefunden:

                          
                        $variable_mit_string = strval($variable);  
                        
                        
                        1. Tach!

                          Aber jetzt nochmal zu Thema zurück: Wie bekomme ich den Text aus dem SimpleXML-Objekt raus? Denn irgendwie müsste es ja gehen.
                          Sagte ich doch schon: Typecast zu String.
                          Ich wollte nicht wissen auf welche Art, sondern WIE das geht.

                          Typecasting ist ein kein ungebräuchlicher Begriff: http://php.net/manual/en/language.types.type-juggling.php#language.types.typecasting.

                          dedlfix.

  2. Hello,

    session_start();
    ...
    $user_data=simplexml_load_file($t1."/admin/data/user.xml");
    $_SESSION["user_name"]=$user_data->user[$i]["user_name"];
    header("Location: admin/index.php");

      
    Für welche URL wurde die Session eröffnet?  
    Auf welche URL wurde umgeleitet?  
    Hast Du festgestellt, ob der "Session-Cookie" trotz Pfad-Abweichungen mitgesandt wurde?  
      
    Überlege Dir, was Du als User (= HTML-Progger, Scriptersteller) vom Client (= Browser) verlangst, dass er es an den Server weitergibt, der das dann auch noch auswerten können soll :-)  
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://restaurant-zur-kleinen-kapelle.de>