Juicy: Session-Variable an Include-Datei übergeben

Hallo!

Folgendes Problem: Ich habe eine PHP-Datei, in der eine Session gestartet und die Variable $_SESSION['style] registriert wird:

---
session_start();

if (isset($_GET['style'])) {
    $_SESSION['style'] = $_GET['style'];
} elseif (!isset($_SESSION['style'])) {
    $_SESSION['style'] = 'standard';
}
---

Innerhalb der Datei kann ich die Variable dann auch verarbeiten. Allerdings wird sie nicht an eine Include-Datei übergeben, obwohl sie dort verarbeitet werden muss.
Wie kann ich die Session-Variable an die Include-Datei übergeben?
Ich habe gelesen, dass man offenbar Global-Variablen definieren kann, aber ich konnte bisher nicht herausfinden, wie das funktioniert und ob das mein Problem löst.

Würde mich über Hilfe freuen.
Danke im Voraus!

Greetz
Juicy

  1. Moin!

    Folgendes Problem: Ich habe eine PHP-Datei, in der eine Session gestartet und die Variable $_SESSION['style] registriert wird:


    session_start();

    if (isset($_GET['style'])) {
        $_SESSION['style'] = $_GET['style'];
    } elseif (!isset($_SESSION['style'])) {
        $_SESSION['style'] = 'standard';
    }

    Ab dieser Codestelle steht dir also spätestens (ggf. auch schon ab dem session_start()) die Variable $_SESSION['style'] zur Verfügung - auch in ab hier eingebauten Includes bzw. ab hier in in Includes eingebundenen Funktionen, die auch vorher schon eingebunden sein können.

    Wie kann ich die Session-Variable an die Include-Datei übergeben?

    Das ist nicht notwendig, wenn deine Programmlogik stimmt.

    Ich habe gelesen, dass man offenbar Global-Variablen definieren kann, aber ich konnte bisher nicht herausfinden, wie das funktioniert und ob das mein Problem löst.

    Es löst dein Problem nicht, also brauchst du auch nicht wissen, wie es funktioniert.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Ab dieser Codestelle steht dir also spätestens (ggf. auch schon ab dem session_start()) die Variable $_SESSION['style'] zur Verfügung - auch in ab hier eingebauten Includes bzw. ab hier in in Includes eingebundenen Funktionen, die auch vorher schon eingebunden sein können.

      Das Include ist danach eingebaut. Deshalb wundert es mich ja auch, dass die Variable dort nicht zur Verfügung steht.
      Aber das Includen klappt ansonsten, also kann es da nicht an einem Fehler liegen.

      Greetz
      Juicy

  2. Hi!

    Wie kann ich die Session-Variable an die Include-Datei übergeben?

    Du kannst eine Variable auch nicht an die Datei übergeben.
    Der Code deiner include-Datei wird in dein Script eingebunden - an der Stelle, wo du dir Funktion include() aufrufst.
    Daher ist es weder notwendig, noch sinnvoll oder möglich, die Variable zu übergeben.
    Und da es sich in deinem Fall auch noch über eine Session-Variable handelt, müßtest du problemlos darauf zugreifen können.

    Ich habe gelesen, dass man offenbar Global-Variablen definieren kann, aber ich konnte bisher nicht herausfinden, wie das funktioniert und ob das mein Problem löst.

    Ja, man kann auch mit globalen Variablen arbeiten, was man in den meisten Fällen jedoch vermeiden sollte, wenn es möglich ist. (saubere Programmierung)
    Mit dem Schlüsselwort "global" kann man globale Variablen anlegen.
    Das brauchst du in deinem Fall aber nicht.
    Bei $_SESSION handelt es sich um ein superglobales Array. Darauf kannst du  inner- und außerhalb deiner Funktionen zugreifen.

    Dein Problem scheint also irgendwie irgendwo anders zu liegen.
    Vielleicht solltest du dir mal anschauen, welchen Inhalt $_SESSION bei dir denn wirklich hat.

    Im PHP-Handbuch findest du alles was du brauchst:
    Variablen
    Geltungsbereich von Variablen
    Vordefinierte Variablen
    Session-Variablen

    Schöner Gruß,
    rob

    1. Hi,

      Du kannst eine Variable auch nicht an die Datei übergeben.
      Der Code deiner include-Datei wird in dein Script eingebunden - an der Stelle, wo du dir Funktion include() aufrufst.
      Daher ist es weder notwendig, noch sinnvoll oder möglich, die Variable zu übergeben.
      Und da es sich in deinem Fall auch noch über eine Session-Variable handelt, müßtest du problemlos darauf zugreifen können.

      Ja, das dachte ich eigentlich auch. Schön wär's... :(

      Dein Problem scheint also irgendwie irgendwo anders zu liegen.
      Vielleicht solltest du dir mal anschauen, welchen Inhalt $_SESSION bei dir denn wirklich hat.

      Das habe ich schon überprüft. Ich habe die Variable im Hauptdokument ausgeben lassen, sie hatte den korrekten Inhalt.

      Alles ein einziges Rätsel.

      Greetz
      Juicy

      1. Nachtrag:
        Habe festgestellt, dass nicht nur die Session-Variable, sondern überhaupt keine Variablen in der Include-Datei verfügbar sind.
        Aber ich entdecke absolut keinen Fehler im Code!

        Danke trotzdem für eure Antworten!^^

        lg
        Juicy

        1. Hallo,

          Habe festgestellt, dass nicht nur die Session-Variable, sondern überhaupt keine Variablen in der Include-Datei verfügbar sind.
          Aber ich entdecke absolut keinen Fehler im Code!

          Dann wirst Du uns einen minimierten Testfall, bei dem das immer noch auftritt, zeigen müssen, sonst können wir Dir nicht weiterhelfen.

          Viele Grüße,
          Christian

        2. Moin!

          Aber ich entdecke absolut keinen Fehler im Code!

          Ich auch nicht!

          Das liegt bei mir aber daran, dass ich deinen Code nicht kenne. Ändere das doch bitte mal, vier und mehr Augen sehen mehr, als deine zwei.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
        3. echo $begrüßung;

          Aber ich entdecke absolut keinen Fehler im Code!

          Vielleicht versucht dich PHP schon die ganze Zeit auf einen Fehler aufmerksam zu machen, den du aufgrund der PHP-Default-Konfiguration nicht zu sehen bekommst. Stell doch den error_reporting mal auf E_ALL.

          echo "$verabschiedung $name";

          1. Stell doch den error_reporting mal auf E_ALL.

            Wie macht man das denn?
            Sorry, falls das eine dumme Frage ist^^

            lg
            Juicy

            1. echo $begrüßung;

              Stell doch den error_reporting mal auf E_ALL.
              Wie macht man das denn?

              Es gibt diverse Möglichkeiten (Eine weiter unten stehende kann die Einstellung einer weiter oben stehenden überscheiben):

              • in der php.ini konfigurieren. Wo die zu finden ist, sagt der Aufruf von phpinfo(); Damit stellt man sich sein PHP komplett um.
              • a) Wenn PHP als Apache-Modul läuft kann man eine Per-Verzeichnis-Konfiguration (.htaccess) vornehmen. Hier muss man sich aber die Zahlenwerte der E_*-Konstanten ausrechnen und verwenden.
              • b) Wenn PHP als CGI läuft kann man gegebenenfalls eine eigene php.ini erstellen und in das Script-Verzeichnis legen. Informationen darüber muss der Provider/Systembetreuer liefern.
              • im Script mittels der Funktion error_reporting()

              echo "$verabschiedung $name";

              1. Okay, danke.
                Also da kommt dann bei der Verwendung der Session-Variable in der Include-Datei folgende Fehlermeldung:

                Notice: Undefined variable: _SESSION

                lg
                Juicy

                1. echo $begrüßung;

                  Also da kommt dann bei der Verwendung der Session-Variable in der Include-Datei folgende Fehlermeldung:
                  Notice: Undefined variable: _SESSION

                  Deise Fehlermeldung konnte ich auch erhalten, wenn ich auf $_SESSION zugreifen wollte, bevor eine Session gestartet wurde. Du solltest die Reihenfolge deines Codes prüfen.

                  echo "$verabschiedung $name";

                  1. Deise Fehlermeldung konnte ich auch erhalten, wenn ich auf $_SESSION zugreifen wollte, bevor eine Session gestartet wurde. Du solltest die Reihenfolge deines Codes prüfen.

                    Doch, die Session wird schon vorher gestartet. Im Hauptdokument ist der Inhalt der Session-Variable ja auch verfügbar.

                    lg
                    Juicy

                    1. Hallo,

                      Deise Fehlermeldung konnte ich auch erhalten, wenn ich auf $_SESSION zugreifen wollte, bevor eine Session gestartet wurde. Du solltest die Reihenfolge deines Codes prüfen.

                      Doch, die Session wird schon vorher gestartet. Im Hauptdokument ist der Inhalt der Session-Variable ja auch verfügbar.

                      Ok, also, sehe ich das richtig, dass Du im Prinzip folgende Konstruktion hast:

                      haupt.php:

                      <?php  
                      session_start ();  
                      $_SESSION['foo'] = 'bar';  
                      include 'neben.php';  
                      ?>
                      

                      neben.php:

                      <?php  
                      echo $_SESSION['foo'];  
                      ?>
                      

                      Oder anders gesagt: Probiere mal obigen Code - der müsste *definitiv* funktionieren. Wenn er das tut und Dein Code nicht, dann betrachte die Unterschied zwischen Deinem Code und dem obigen Code. Wenn obiger Code *nicht* funktioniert, dann läuft etwas *sehr*, *sehr* schief.

                      Viele Grüße,
                      Christian

                      1. Hi!

                        Ich habe jetzt durch viel Herumprobieren den Fehler "eingekreist" und festgestellt, dass die Verwendung der Session-Variable offenbar nicht klappt, wenn die Include-Datei über einen absoluten Pfad (http://www.server.de/verzeichnis/datei.php) statt über einen relativen Pfad wie "datei.php" included wird.
                        Da die Include-Datei von Hauptdateien aus vielen verschiedenen Verzeichnissen eingebaut wird, wird mir wohl nichts anderes übrig bleiben, als die Include-Datei in jedes einzelne Verzeichnis zu kopieren oder in ein Unterverzeichnis zu legen und in jeder einzelnen Hauptdatei den relativen Pfad anzupassen.
                        Aber immerhin habe ich den Fehler jetzt entdeckt und kann ihn beheben!^^

                        Vielen Dank für eure Hilfe - ich hoffe, ich habe euch mit meinem Problem nicht zu sehr die Nerven geraubt ;)

                        Greetz
                        Juicy

                        1. echo $begrüßung;

                          Ich habe jetzt durch viel Herumprobieren den Fehler "eingekreist" und festgestellt, dass die Verwendung der Session-Variable offenbar nicht klappt, wenn die Include-Datei über einen absoluten Pfad (http://www.server.de/verzeichnis/datei.php) statt über einen relativen Pfad wie "datei.php" included wird.

                          Damit inkludierst du nicht die Datei selbst, sondern das was der Webserver ausliefert, der dieses Dokument hostet. Der führt vor dem Senden das PHP aus, und hat, da es ein neuer Request für ihn ist, nur den Inhalt der "Include"-Datei vorliegen und auch keine Session geöffnet. Das willst du aber so nicht haben und musst deshalb dem include einen Dateinamen und keine URL übergeben.

                          Da die Include-Datei von Hauptdateien aus vielen verschiedenen Verzeichnissen eingebaut wird, wird mir wohl nichts anderes übrig bleiben, als die Include-Datei in jedes einzelne Verzeichnis zu kopieren oder in ein Unterverzeichnis zu legen und in jeder einzelnen Hauptdatei den relativen Pfad anzupassen.

                          Und wenn das zu lästig fällt, kann man sich die Konfiguration des include_path anpassen. Das macht man natürlich am besten in der Server-Konfiguration statt per ini_set() in den einzelnen Scripten.

                          echo "$verabschiedung $name";

                          1. Damit inkludierst du nicht die Datei selbst, sondern das was der Webserver ausliefert, der dieses Dokument hostet. Der führt vor dem Senden das PHP aus, und hat, da es ein neuer Request für ihn ist, nur den Inhalt der "Include"-Datei vorliegen und auch keine Session geöffnet. Das willst du aber so nicht haben und musst deshalb dem include einen Dateinamen und keine URL übergeben.

                            Thx für die gute Erklärung - das ist einleuchtend.
                            Ich hätte aber dann noch eine Frage dazu. Und zwar will ich einen Style Switcher programmieren, bei dem der gewählte Style in der Session registriert und innerhalb der Unterseiten weitergegeben wird. Allerdings werden die Unterseiten im Menü mit einer http-URL verlinkt. Ein relativer Pfad ist nicht möglich, da die Navigations-Datei von Dateien aus verschiedenen Verzeichnissen included wird.
                            Wird die Weitergabe der Session-Variable dann überhaupt gelingen? Wenn nicht, welche Lösungen gäbe es, außer vllt. für jedes Verzeichnis eine einzelne Navi-Datei mit relativen Pfaden anzulegen?

                            Greetz
                            Juicy

                            1. echo $begrüßung;

                              Ich hätte aber dann noch eine Frage dazu. Und zwar will ich einen Style Switcher programmieren, bei dem der gewählte Style in der Session registriert und innerhalb der Unterseiten weitergegeben wird. Allerdings werden die Unterseiten im Menü mit einer http-URL verlinkt. Ein relativer Pfad ist nicht möglich, da die Navigations-Datei von Dateien aus verschiedenen Verzeichnissen included wird.

                              Trenne bitte Serverseitiges von Clientseitigem, PHP von HTML/HTTP. Ein Client kann von deinem Server nur Ressourcen abfragen. Er muss immer das volle Programm verwenden (http://example.com/pfad/). Es ist egal, ob du die Links für den Client relativ, absolut oder als vollständige URL notierst, er muss das sowieso zu einer vollständigen URL zusammensetzen (mal vereinfacht erklärt).

                              Was dein Server hinter den Kulissen über sein Dateisystem macht, und welche Dateien er ansprechen muss, um eine Ressourcenanforderung zu bedienen, steht wieder auf einem anderen Blatt.

                              Wird die Weitergabe der Session-Variable dann überhaupt gelingen? Wenn nicht, welche Lösungen gäbe es, außer vllt. für jedes Verzeichnis eine einzelne Navi-Datei mit relativen Pfaden anzulegen?

                              Sessions speichern Werte zwischen mehreren Requests. Ein einzelner Request, auch wenn er sich seinen PHP-Code aus mehreren Dateien zusammenholt, braucht keine Werte-Zwischenablage. Es spielt sich alles quasi im gleichen Raum ab. Die Include-Dateien selbst bilden keine eigenen Räume. Der Code, der aus einer Inklude-Datei gelesen wurde, hat die gleichen Zugriffsmöglichkeiten auf die Variablen wie der Code aus der Haupt-Datei.

                              echo "$verabschiedung $name";

                              1. Trenne bitte Serverseitiges von Clientseitigem, PHP von HTML/HTTP. Ein Client kann von deinem Server nur Ressourcen abfragen. Er muss immer das volle Programm verwenden (http://example.com/pfad/). Es ist egal, ob du die Links für den Client relativ, absolut oder als vollständige URL notierst, er muss das sowieso zu einer vollständigen URL zusammensetzen (mal vereinfacht erklärt).

                                Oh mann, kompliziert...^^ Heißt das denn dann, dass die Session-Variable auch über http-Verlinkungen weitergegeben wird? Also dass ich z.B. in einem Dokument eine Session starte mit einer Variable, und dann im Menü auf eine andere Datei nach dem Schema http://server.de/datei.php linke. Dort wird dann wieder mit session_start() die Session gestartet. Ist dann dort die im vorherigen Dokument registrierte Session-Variable verfügbar? Ja, oder?

                                lg
                                Juicy

                                1. echo $begrüßung;

                                  Heißt das denn dann, dass die Session-Variable auch über http-Verlinkungen weitergegeben wird? Also dass ich z.B. in einem Dokument eine Session starte mit einer Variable, und dann im Menü auf eine andere Datei nach dem Schema http://server.de/datei.php linke. Dort wird dann wieder mit session_start() die Session gestartet. Ist dann dort die im vorherigen Dokument registrierte Session-Variable verfügbar? Ja, oder?

                                  Die "Session-Variablen" werden nicht weitergegeben. Eine Session funktioniert so, dass der Client bei jedem Request ein eindeutiges Erkennungsmerkmal mitliefert, die Session-ID. Diese kann in Form eines Cookies oder eines Query- oder Post-Parameters übergeben werden. Der Server ordnet dieser Session-ID eine interne Datenhaltung zu. Das ist im Normalfall eine Datei. Bei einem Request, der ein session_start() ausführt und eine Session-ID mitbringt, öffnet PHP sich die dazugehörige Datei liest daraus Werte und trägt welche ein (deine Lese- und Schreibzugriffe auf das $_SESSION-Array). Der nächste Request macht das auch wieder. Alle Requests mit der selben Session-ID haben also Zugriff auf die selben Daten.

                                  echo "$verabschiedung $name";

                                  1. Eine Session funktioniert so, dass der Client bei jedem Request ein eindeutiges Erkennungsmerkmal mitliefert, die Session-ID. Diese kann in Form eines Cookies oder eines Query- oder Post-Parameters übergeben werden. Der Server ordnet dieser Session-ID eine interne Datenhaltung zu.

                                    Dann kann ich doch aber diese Session-ID im Link übergeben, oder? Jedenfalls hab ich schon oft Links nach dem Schema "http://server.de/datei.php?PHPSESSID=123456789" oder sowas in der Art. Wie erfährt man denn die Session-ID und baut sie in den Link ein?

                                    greetz
                                    Juicy

                                    1. echo $begrüßung;

                                      Dann kann ich doch aber diese Session-ID im Link übergeben, oder?

                                      Ja, das ist eine der Methoden. Sie wird auch automatisch von PHP verwendet, wenn die Cookie-Methode nicht verfügbar ist (und die PHP-Konfiguration das nicht verhindert).

                                      Wie erfährt man denn die Session-ID und baut sie in den Link ein?

                                      Bitte lies das im PHP-Handbuch-Kapitel über Sessions nach. Es gibt die Konstante SID und die Funktion session_id().

                                      echo "$verabschiedung $name";

                2. Hallo,

                  Also da kommt dann bei der Verwendung der Session-Variable in der Include-Datei folgende Fehlermeldung:

                  Notice: Undefined variable: _SESSION

                  Welche PHP-Version verwendest Du?

                  Viele Grüße,
                  Christian