f42: $_SESSION Problem

Hallo liebe Forenmitglieder,
ich verzweifle gerade an einem wahrscheinlich trivialen Situation.
Folgendes:

Ich übergebe mit $_SESSION[] eine Variable vom Typ Array.
Die Datei in der ich die Variable übergebe liegt im Verzeichnis ./php
im Grundverzeichnis liegt die Datei index.php aus ihr heraus kann ich die Variable problemlos auslesen. Wenn ich aber versuche die Variable mit der Datei ./stylesheets/design.php auszulesen, kriege ich keinen Wert zurück. Hier noch kurz ein bisschen Code zum Anschauen:

  
//Übergeben der Variable  
$_SESSION['design'] = serialize($dbsql);
//Auslesen der Variable  
$dbsql = unserialize($_SESSION['design']);

Die Ordnerstruktur sieht so aus:

  
| index.php  
|  
|-php  
|  |-mysql_query.php //Hier wird die Variable übergeben  
|  
|-stylesheets  
   |-design.php //Hier wird die Variable ausgelesen, wenn das mal ginge^^  

Es funktioniert übrigends auch nicht, wenn ich die Variable direkt in der Index.php übergebe...
schonmal vielen Dank.

  1. Hi,

    Ich übergebe mit $_SESSION[] eine Variable vom Typ Array.
    Die Datei in der ich die Variable übergebe liegt im Verzeichnis ./php
    im Grundverzeichnis liegt die Datei index.php aus ihr heraus kann ich die Variable problemlos auslesen. Wenn ich aber versuche die Variable mit der Datei ./stylesheets/design.php auszulesen, kriege ich keinen Wert zurück.

    Stattdessen bekommst du aber bestimmt Warnmeldungen, wenn du dein PHP zum Entwickeln vernünftig eingestellt hast (das bedeutet in erster Linie error_reporting auf E_ALL und display_errors auf on gestellt).

    Das Problem an sich klingt danach, als ob die Übergabe der Session-ID per Cookie stattfindet, und dieser aber aufgrund der beim Setzen verwendeten Parameter nicht überall „gültig” bzw. lesbar ist.
    Da wäre also als erstes der path-Parameter des Cookies zu checken, der sich aus der entsprechenden Session-Konfigurationsoption ergibt.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Das Problem an sich klingt danach, als ob die Übergabe der Session-ID per Cookie stattfindet, und dieser aber aufgrund der beim Setzen verwendeten Parameter nicht überall „gültig” bzw. lesbar ist.
      Da wäre also als erstes der path-Parameter des Cookies zu checken, der sich aus der entsprechenden Session-Konfigurationsoption ergibt.

      MfG ChrisB

      session_name("jbsid");  
      session_start();
      
      1. Hi,

        Da wäre also als erstes der path-Parameter des Cookies zu checken, der sich aus der entsprechenden Session-Konfigurationsoption ergibt.

        session_name("jbsid");

        session_start();

          
        Das hat nichts mit dem path-Parameter des Cookies zu tun.  
          
        <http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-path>  
        <http://www.php.net/manual/en/function.setcookie.php> (nähere Erläuterung der Bedeutung des path-Parameters)  
          
        MfG ChrisB  
          
        
        -- 
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        
  2. Hallo,
    Ich tippe mal stark darauf, dass $dbsql eine Resource irgendeiner Art ist (Datenbank-Verbindungs-Handle, SQL-Cursor o.ä.).

    In diesem Fall geht kein Serailize:
    "[...]serialize() kann mit allen Typen umgehen, ausgenommen mit dem resource-Typ[...]"
    Würde auch wenig Sinn machen, da nach Abarbeiten einer PHP-Datei i.d.Regel ohnehin alle Resourcen wieder geschlossen werden und dann quasi "weg" sind.

    Andernfalls:

    Bist Du sicher, dass Dein Session-Handling korrekt funktioniert?
    Was liefert

      
    echo session_id();  
    
    

    in den zwei Dateien?

    Wenn da unterschiedliche Werte bei rauskommen, funktioniert das weiterreichen der Session zwischen beiden Dateien offenbar nicht.

    Hope that helps,

    Viele Grüße,
    Jörg

    1. Hallo,
      Ich tippe mal stark darauf, dass $dbsql eine Resource irgendeiner Art ist (Datenbank-Verbindungs-Handle, SQL-Cursor o.ä.).

      Ja, aber ich habe noch nicht so ganz verstanden, warum das keinen Sinn macht...

      echo session_id();, liefert in der Datei design.php nichts zurück.

      1. Hallo,

        Ja, aber ich habe noch nicht so ganz verstanden, warum das keinen Sinn macht...

        Also, nehmen wir mal an, Dein $dbsql ist ein Connection-Handle und wird in der index.php aufgemacht, also in etwa so:

          
        $dbsql = mysql_connect  ("locahost"  "user", "pass");  
        
        

        Jetzt ist die index.php am Ende ihrer Ausführung angekommen. Der Webserver schliesst automatisch alle offenen Resourcen, also auch die Datenbank-Verbindung.
        Jetzt rufst Du Deine "design.php" auf. Selbst WENN Du die offene Datenbankverbindung serialisieren KÖNNTEST, sie wäre jetzt ohnehin zu, und du müsstest sie neu aufmachen.
        => Macht also keinen Sinn, zumindest bei Standard-PHP nicht.

        Andere Architekturen (z.b. J2EE) können Resourcen auch über verschiedene Requests im Speicher halten, und da ist das dann sogar sinnvoll, wenn z.b. die Datenbankverbindung offen bleibt, weil man sich so den Overhead für das Verbindung-Aufmachen spart.
        Allerdings würde man auch in diesem Fall nicht die Datenbankverbindung serialisieren, sondern eher eine allgemeine Funktion programmieren, die immer eine Datenbank-Verbindung zurückgibt (oder eine erzuegt) - Stichwort Singleton.
        Theoretisch kann man für PHP sowas mit FastCGI basteln, wenn man's unbedingt braucht - braucht man aber in der Regel nicht, wenns nicht um hochperformante Sachen geht.

        echo session_id();, liefert in der Datei design.php nichts zurück.

        Das kommt dann erschwerend noch hinzu.
        Wie übergibst Du die Session-ID denn zwischen den beiden Skripten? Per Cookie oder per URL-Parameter? Rufst Du auch in der "design.php" "session_start()" auf?

        1. Wie übergibst Du die Session-ID denn zwischen den beiden Skripten? Per Cookie oder per URL-Parameter? Rufst Du auch in der "design.php" "session_start()" auf?

          genau das war das Problem...
          Thanks

          1. Moin!

            Wie übergibst Du die Session-ID denn zwischen den beiden Skripten? Per Cookie oder per URL-Parameter? Rufst Du auch in der "design.php" "session_start()" auf?

            genau das war das Problem...

            Es ist obendrein nicht sinnvoll, dass du den Serialisierungs-Zirkus veranstaltest.

            $dbsql = array(....);

            $_SESSION['design'] = $dbsql;
            ---
            $dbsql = $_SESSION['design'];

            Funktioniert vorwärts wie rückwärts prima.

            Vollkommen optimiert wäre es, wenn du die im Prinzip überflüssige Variable $dbsql auch noch eliminierst, und direkt mit $_SESSION['design'] arbeitest. Es gibt schließlich auch zwei- oder dreidimensionale Arrays.

            - Sven Rautenberg

            1. Hi,

              Es ist obendrein nicht sinnvoll, dass du den Serialisierungs-Zirkus veranstaltest.

              Genau, den veranstaltet der Default-Sessionmechanismus von PHP nämlich schon selber - sonst könnte er ja gar nicht komplexere Datenobjekte in Textform ablegen.

              Was du (Frager) da machst, ist also doppelt gemoppelt, und hält in diesem Fall absolut nicht besser.

              MfG ChrisB

              --
              “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
              1. :D
                Ok, danke. Werd das serialisieren sein lassen.
                Und die VAriable ist eh schon da, da ich die vorher schon verwende um Daten auszulesen.

                MfG f42

                Hi,

                Es ist obendrein nicht sinnvoll, dass du den Serialisierungs-Zirkus veranstaltest.

                Genau, den veranstaltet der Default-Sessionmechanismus von PHP nämlich schon selber - sonst könnte er ja gar nicht komplexere Datenobjekte in Textform ablegen.

                Was du (Frager) da machst, ist also doppelt gemoppelt, und hält in diesem Fall absolut nicht besser.

                MfG ChrisB