Peter Kuppinger: Sessionsübergabe bei require_once in CASE

Guten Tag,

Ich habe eine Session in einer Datei (test.php) gestartet
//test.php
session_start();
$_SESSION['myvar'] = "001";

//bei case view wird die Datei links_view.inc.php reingeladen
case NULL :{break;}
case "view" :{ require_once("links_view.inc.php");break;}

//Zusatz-Datei links_view.inc.php sieht so aus:
echo "$myvar";

beim ersten aufrufen der Datei test.php wird die Variable myvar in den Sessions angelegt. Das geht. Beim erneuten aufrufen mit test.php?$action=view wird die datei nochmals durchlaufen und lädt die Zusatz-Datei links_view.inc.php mit ein. Hier wird dann aber die variable $myvar nicht angezeigt.

Frage: Warum wird die nicht angezeigt?

Ich freue mich über eure Hilfe,

Peter Kuppinger

  1. Hallo,

    //Zusatz-Datei links_view.inc.php sieht so aus:
    echo "$myvar";

    falls Du REGISTER_GLOBALS in der php.ini nicht aktiviert hast (was auch besser wäre), müsste es echo $_SESSION['myval'] heissen.

    Schöne Grüße
    Axel

    1. Versuche ich auch noch.

  2. Hallo,

    case "view" :{ require_once("links_view.inc.php");break;}
    echo "$myvar";

    "require" wird beim ersten Durchlauf des Parsers ausgeführt, und ist auch nicht abdingbar. Die Session wird aber erst im Interpretationslauf des Scriptes gestartet.

    Unabhängig davon, dass ich diese Require- und Include-Manie nicht verstehe, müsstest Du hier include_once() benutzen. Das ist abdingbar und wird erst im Interpretationslauf ausgeführt, genau dann, wenn die Programmsteuerung es vorsieht.

    LG
    Chris

    1. ok habe ich abgeändert. ich glaube mein problem ist, dass beim wiederholten aufrufen der datei meine session-variable wieder überschrieben wird:

      session_start();
      $_SESSION['myvar'] = $vari; //$vari wurde nur beim ersten aufrufen mit dem link test.php?$vari=001 mitgegeben und ist jetzt in meiner session gespeichert.

      beim erneuten aufrufen der datei test.php ohne die mitgabe der variablen über die URL überschreibt es meine $_SESSION['myvar'] - in diesem Fall steht nichts drin, das $vari='' ist.

      Wie kann ich verhindern, das, wenn meine Session-variable angelegt wurde, nicht wieder überschrieben wird?

      Bin ich auf dem Holzweg?

      Kuppinger

      1. Hallo,

        Axel hat Dir noch einen anderen Fehler genannt.
        Dein Script hat auch noch mehr Fehler.

        ok habe ich abgeändert. ich glaube mein problem ist, dass beim wiederholten aufrufen der datei meine session-variable wieder überschrieben wird:

        session_start();
        $_SESSION['myvar'] = $vari; //$vari wurde nur beim ersten aufrufen mit dem link test.php?$vari=001 mitgegeben und ist jetzt in meiner session gespeichert.

        Das ist richtig.

        Als erstes solltest Du mal oben ins Script schreiben:

        error_reporting(E_ALL);
        ini_set('display_errors','1');

        Dann werden Dir alle Versäumnisse angezeigt, was am Anfang aber zu Folgefehlern (cannot send headers, o.ä.) führen wird. Mach Dir nix draus :-)

        Und dann solltest Du die Kommunikationswege trennen:

        $_GET ist ein Array mit allen Werten, die als Parameter der URi kommen
        $_POST ist ein Array mit allen Werten, die per <form method="post" ...> kommen
        $_COOKIE ist ein Array, dass die Cookies enthält,
        usw.

        Wenn Dein Parameter also per URi übertragen wurde

        test.php?vari=001   ## bitte ohne den Dollar

        dann kannst Du das jetzt prüfen und verarbeiten:

        if (isset($_GET['vari'])
          {
            $_SESSION['vari'] = $_GET['vari'];
          }

        Nun wird die Session nur bedient, wenn die Variable gesendet wurde.

        beim erneuten aufrufen der datei test.php ohne die mitgabe der variablen über die URL überschreibt es meine $_SESSION['myvar'] - in diesem Fall steht nichts drin, das $vari='' ist.

        Viel schlimmer, wenn sie nichts gesendet wurde, löst sie der Zugriff auf die GET-Variable (die nun nicht angelegt ist) eine Notice aus, die Dir aber nicht angezeigt wird, weil Notices in der Standardeinstellung auf OFF stehen. Das hast Du nun aber mit error_reporting() korrigiert. Notices gehören bei PHP zu den  wichtigsten Fehlermeldungen, da das Script trotz Fehler weiterläuft!

        Wie kann ich verhindern, das, wenn meine Session-variable angelegt wurde, nicht wieder überschrieben wird?

        Bin ich auf dem Holzweg?

        Nein, Du bist auf dem goldenen Weg! Mach weiter so und frag auch weiter so. Qualifizierte Fragen werden hier meistens POST-wendend *gg* beantwortet.

        LG

        Chris

        1. Hallo und vielen Dank Chris...

          error_reporting(E_ALL);
          ini_set('display_errors','1');

          habe ich drin und hilft mir zu verstehen was los ist ;-)

          Dann werden Dir alle Versäumnisse angezeigt

          stimmt, da steht:
          Notice: Undefined index: vari in links_view.inc.php on line 2

          so jetzt bin ich weitergekommen und habe festgestellt, dass
          wenn ich vorher dieses Include <? include("admin_nav.php");?> aufrufe kann ich danach keine variable aus der session mehr ausgeben. woran das liegt weiss ich nicht so sieht admin_nav.php aus:

          <TABLE cellSpacing="0" cellPadding="0" border="0" width="155">
            <TR ...
            </TR>
          </TABLE>

          Es hat also doch was damit zu tun wie und welche Dateien ich include. lasse ich dieses eine inklude weg funktioniert alles.

          ich verstehe das nicht. Ihr?

          Kuppinger

          1. Ich Habs gefunden..

            in der inkludierten datei stand versteckt noch ein

            <? session_unset(); ?

            drin. das hat mir alles genommen was ich gespeichert habe. ich hatte es mal reingesetzt und vergessen. oh! wie blöd von mir. habe aber viel gelernt. danke chris.

    2. echo $begrüßung;

      "require" wird beim ersten Durchlauf des Parsers ausgeführt, und ist auch nicht abdingbar.
      [...] include_once() [...] Das ist abdingbar und wird erst im Interpretationslauf ausgeführt, genau dann, wenn die Programmsteuerung es vorsieht.

      Das war einmal so. Seit 4.0.2 verhält sich require in diesem Punkt genauso wie include. Siehe http://de.php.net/manual/en/function.require.php (das "Note:..." unter dem Beispiel)

      echo "$verabschiedung $name";