Enrico: Gültigkeit voin Variablen über mehrere "Skripte" hinaus

Hallo und guten Abend,

ich habe eine Frage zur Gültigkeit von Variablen und hoffe, dass ich deswegen keinen Rüffel bekomme.

Wenn ich beispielsweise folgende Struktur habe...

<?php

php-Code, der u.a. die Variable $Aktuelle_Seite mit einem Wert belegt.

?>

<html>
      <head>

...

</head>
      <body>

...

<?php

php-Code, der u.a. auf die Variable $Aktuelle_Seite zugreifen soll

?>

...

</body>
   </html>

...wie kann ich es, ohne Verwendung von Cookies, bewerkstelligen, dass ich im zweiten php-Code-Abschnitt auf die Variable $Aktuelle_Seite zugreifen kann?

Soweit ich weiß, verlieren Variablen ihre Gültigkeit, sobald ein php-Skript beendet wird und das Ende eines php-Skripts wird ja mit "?>" gekennzeichnet.

Vielen Dank und Gruß
Enrico

  1. Hi!

    ich habe eine Frage zur Gültigkeit von Variablen und hoffe, dass ich deswegen keinen Rüffel bekomme.

    Warum probierst du nicht einfach, ob deine Befürchtung zurecht besteht oder unbegründet ist?

    ...wie kann ich es, ohne Verwendung von Cookies, bewerkstelligen, dass ich im zweiten php-Code-Abschnitt auf die Variable $Aktuelle_Seite zugreifen kann?

    Einfach zugreifen.

    Soweit ich weiß, verlieren Variablen ihre Gültigkeit, sobald ein php-Skript beendet wird und das Ende eines php-Skripts wird ja mit "?>" gekennzeichnet.

    ?> beendet einen PHP-Code-Bereich. Ein Code-Bereich ist jedoch kein eigenständiges Script.

    Lo!

    1. Hallo dedlfix,

      ok, dann mal an meinem konkreten Fall:

      <?

      error_reporting(E_ALL);
            include ("Dateien/php/Parameter_aus_URL_auslesen.php");

      ?>
         <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
         <html>
            <head>

      ...

      </head>
            <body>

      <?php echo $Aktuelle_Seite; ?>

      ...

      </body>
         </html>

      Die php-Datei sieht folgendermassen aus:

      <?php

      if (isset ($_GET ["Auswahl_Menue"]))
            {
               $Aktuelle_Seite = $_GET["Auswahl_Menue"];

      if ($Aktuelle_Seite == "Gaestebuch" OR $Aktuelle_Seite == "Kontakt")
               {
                  if (isset ($_GET ["Aktion"]))
                  {
                     $Aktion = $_GET["Aktion"];
                  }
                  else
                  {
                     $Aktion = "Einstieg";
                  }

      $Aktuelle_Seite = $Aktuelle_Seite . $Aktion;
               }
            }
            else
            {
               $Aktuelle_Seite = "Neuigkeiten";
            }

      ?>

      Und hier wird nichts ausgegeben, deswegen war meine Vermutung, dass die Variablen außerhalb <?php ?> ihre Gültigkeiten verlieren würden.

      Gruß,
      Enrico

      1. Hello Enrico,

        ok, dann mal an meinem konkreten Fall:

        <?

        error_reporting(E_ALL);
              include ("Dateien/php/Parameter_aus_URL_auslesen.php");

        ?>
           <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

        Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...
        Und die sogenannten Short-Open-Tags (Siehe Suchmaschine) sind auch nicht zu empfehlen!
        Du solltest besser schreiben:

        <?php

        error_reporting(E_ALL);
                include ("Dateien/php/Parameter_aus_URL_auslesen.php");

        ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...

          Ups, das war aber nur in diesem einen Fall der Fall, ansonsten habe ich überall die "ausführliche" Fassung.

          Gruß
          Enrico

          1. Hello,

            Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...

            Ups, das war aber nur in diesem einen Fall der Fall, ansonsten habe ich überall die "ausführliche" Fassung.

            Dein HTML versaust Du auch nicht  mit dem Short-Open-Tag, sondern mit dem Zeilenumbruch vor dem DocType.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo Tom,

              Dein HTML versaust Du auch nicht  mit dem Short-Open-Tag, sondern mit dem Zeilenumbruch vor dem DocType.

              Ok, habe den DocType nun als allererste Zeile notiert, danke für Deinen Hinweis.

              Gruß,
              Enrico

              1. Hi,

                Ok, habe den DocType nun als allererste Zeile notiert, danke für Deinen Hinweis.

                auch das kann problematisch sein: Damit beginnt die Ausgabe von *Nutzdaten* an den Client, nach dieser Ausgabe hast du keine Chance mehr, HTTP-Header zu setzen - etwa Cookies (auch implizit durch session_start()), oder Redirects.

                Ciao,
                 Martin

                --
                Frage an Radio Eriwan: Kann man eigentlich ein guter Kommunist und gleichzeitig ein guter Christ sein?
                Radio Eriwan antwortet: Im Prinzip ja - aber warum sollte man sich das Leben doppelt schwer machen?
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo Martin,

                  oje, da habe ich 'ne Lawine losgetreten... ;-)

                  Ok, dann wieder vor den <html>-Tag.

                  Gruß
                  Enrico

        2. Hi!

          ?>
             <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...

          Hat er nicht.

          Du solltest besser schreiben:
               ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

          http://de.php.net/manual/en/language.basic-syntax.instruction-separation.php
          Wenn ein Zeilenumbruch unmittelbar einem ?> folgt, so gehört er zum schließenden Tag und landet nicht in der Ausgabe.

          Lo!

          1. Hello,

            ?>
               <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
            Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...

            Hat er nicht.

            Du solltest besser schreiben:
                 ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

            http://de.php.net/manual/en/language.basic-syntax.instruction-separation.php
            Wenn ein Zeilenumbruch unmittelbar einem ?> folgt, so gehört er zum schließenden Tag und landet nicht in der Ausgabe.

            *ups*

            "The closing tag for the block will include the immediately trailing newline if one is present. "

            Bedeutet das nicht gerade das Gegenteil?
            Muss man hier eigentlich immer alles erst selber ausprobieren?

            Seit wann funktioniert das denn?
            Das war aber bei älteren PHP-Versionen nochn nicht so. Ausprobiert habe ich eben nur kurz mit Version 5.2.9.

              
            <?php   ### closing-tag.php ###  
              
            echo "hier steht Text";  
              
            ?>  
            und hier noch mehr  
            
            

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi!

              "The closing tag for the block will include the immediately trailing newline if one is present. "
              Bedeutet das nicht gerade das Gegenteil?

              Nein, der Closing-Tag wird ja nicht ausgegeben. Wenn das Newline zu ihm gehört, wird auch das nicht ausgegeben.

              Seit wann funktioniert das denn?

              Ich denke, das war schon immer so. Das fällt nur nie so richtig auf, wenn man auf Zeilenumbrüche in der Ausgabe nicht besonders achtet. Der Browser stört sich ja auch oftmals nicht daran. Kein Fehler - kein Grund zum Nachforschen - unbemerkt geblieben.

              Lo!

          2. Guten Tag!

            ?>
               <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
            Nur so BTW, aber hier hast Du Dir schon Dein HTML versaut...

            Hat er nicht.

            Du solltest besser schreiben:
                 ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

            http://de.php.net/manual/en/language.basic-syntax.instruction-separation.php
            Wenn ein Zeilenumbruch unmittelbar einem ?> folgt, so gehört er zum schließenden Tag und landet nicht in der Ausgabe.

            Das war mir auch neu, dass der Zeilenumbruch direkt nach dem ?> nicht in der HTML-Ausgabe landet. Und wie ist das bei einem Include? Wenn ich einen PHP-Block in einen anderen include und in der includierten Datei steht dann nach dem ?> noch ein Zeilenumbruch? Wird der uach rausoperiert?

            Hab jetzt gerade kein PHP zum Ausprobieren. Darum guckte ich eigentlich, weil ichs nicht wieder zum Laufen bringe...

            Danke für Response
            Rosa

      2. Hi!

        Und hier wird nichts ausgegeben, deswegen war meine Vermutung, dass die Variablen außerhalb <?php ?> ihre Gültigkeiten verlieren würden.

        Da ist ja auch keine Anweisung zu sehen, die eine Ausgabe erzeugen könnte.

        Lo!

        1. Hi!

          Und hier wird nichts ausgegeben, deswegen war meine Vermutung, dass die Variablen außerhalb <?php ?> ihre Gültigkeiten verlieren würden.
          Da ist ja auch keine Anweisung zu sehen, die eine Ausgabe erzeugen könnte.

          Ach nee, das ist ja die zu inkludierende Datei, die Ausgabe erfolgt im Haupt-Script. Das muss funktionieren.

          Wenn du immer beim Entwickeln das error_reporting auf E_ALL stellst (und display_errors auf on) würden dir PHP eine Notice-Meldung zeigen, wenn du tatsächlich versuchen solltest, nicht vorhandene Variablen zu lesen. Das ist aus PHP-Sicht nicht unbedingt ein Fehler, weswegen das ja per Default auch nicht angemahnt wird, aber es kann auf Unstimmigkeiten hindeuten, wie Tippfehler beim Variablennamen, falscher Gültigkeitsbereich oder vergessene Initialisierung.

          Lo!

        2. Hallo dedlfix,

          Da ist ja auch keine Anweisung zu sehen, die eine Ausgabe erzeugen könnte.

          Zuerst war es eine allgemeine Frage bezüglich der Gültigkeiten, in meinem nächsten Posting hatte ich in diesem Beitrag die testweise Anweisung mit ausgegeben:

          <body>

          <?php echo $Aktuelle_Seite; ?>

          ...

          </body>

          Aber jetzt funktioniert es ja, auch wenn ich keine Ahnung habe, warum jetzt, aber vorher nicht, ohne dass ich etwas geändert habe.

          Gruß
          Enrico

          1. Hi!

            Da ist ja auch keine Anweisung zu sehen, die eine Ausgabe erzeugen könnte.
            Zuerst war es eine allgemeine Frage bezüglich der Gültigkeiten, in meinem nächsten Posting hatte ich in diesem Beitrag die testweise Anweisung mit ausgegeben:

            Naja, die Frage stellte sich dir nur, weil du sie als eine Ursache vermutet hast. Das war aber, wie sich zeigte, nicht die Ursache für dein eigentliches Problem.

            Aber jetzt funktioniert es ja, auch wenn ich keine Ahnung habe, warum jetzt, aber vorher nicht, ohne dass ich etwas geändert habe.

            Vielleicht ein Cache-Problem. In solchen Fällen kann helfen, das Verfallsdatum (Expires) auf 0 zu setzen.

            Lo!

            1. Hallo dedlfix,

              Das war aber, wie sich zeigte, nicht die Ursache für dein eigentliches Problem.

              Leider oder Gott sei Dank, je nach dem ;-)

              Wenn ich das Cache-Problem vorher hätte erahnen können, dann hätte ich mir die Fehlersuche sparen können und hätte euch nicht auch noch bemühen müssen.

              In solchen Fällen kann helfen, das Verfallsdatum (Expires) auf 0 zu setzen.

              Hab ich ergänzt, hoffentlich bleibt's bei diesem einmaligen spontanen Verhalten meines Füchslein.

              Danke für Deine Hilfe.

              Gruß
              Enrico

  2. Hello Enrico,

    wie funktioniert das mit dem PHP?

    Du hast einen Webserver, dem Du oder der Adminsitrator gesagt haben, welche Ressourcen (im einfachsten Fall abgebildet auf eine Scriptdatei) bei einem Request (der Browser ruft eine "Seite" auf) durch den PHP-Parser verarbeitet werden sollen.

    Im Normalfall sind das z.B. alle _Dateien_, die auf *.php enden.
    lt darin alle Abschnitte, die als
    Nun liest der Parser die aurgerufene "Seite" erstmal durch, und sammelt darin alle Abschnitte, die als PHP-Code ausgezeichent sind

    <?php

    ## hier steht Code

    ?>

    Diese werden dann vom Interpreter ausgewertet. Alle Variablen, die in einem der Abschnitte festgelegt worden sind, gelten daher auch in den anderen Abschnitten, vorausgesetzt, dass sie innerhalb der ermittelten PHP-Struktur auf einer Ebene liegen (-> Scope).

    Variablen, die also _nur__innerhalb_ einer PHP-Funktion verwendet werden, sind außerhalb der Funktion nicht mehr gültig. Es könnte aber gleichnamige Variablen außerhalb der Funktion geben, die aber mit denjenigen innerhalb (erstmal) nichts zu tun haben.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,

      Alle Variablen, die in einem der Abschnitte festgelegt worden sind,
      gelten daher auch in den anderen Abschnitten, vorausgesetzt, dass sie
      innerhalb der ermittelten PHP-Struktur auf einer Ebene liegen (-> Scope)

      Was meinst Du mit "auf einer Ebene" genau?

      Variablen, die innerhalb einer PHP-Funktion verwendet werden, sind
      außerhalb der Funktion nicht mehr gültig

      Das wusste ich (<-- ganz normal formuliert), aber ich habe hier ja keine Funktionen, also müsste ich doch ganz normal auf $Aktuelle_Seite zugreifen können ?!

      Gruß
      Enrico

      1. Hello,

        Alle Variablen, die in einem der Abschnitte festgelegt worden sind,
        gelten daher auch in den anderen Abschnitten, vorausgesetzt, dass sie
        innerhalb der ermittelten PHP-Struktur auf einer Ebene liegen (-> Scope)

        Was meinst Du mit "auf einer Ebene" genau?

        Variablen, die innerhalb einer PHP-Funktion verwendet werden, sind
        außerhalb der Funktion nicht mehr gültig

        Das wusste ich (<-- ganz normal formuliert), aber ich habe hier ja keine Funktionen, also müsste ich doch ganz normal auf $Aktuelle_Seite zugreifen können ?!

        ...also befindest Du dich auf einer Programmebene in Deinem Script...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          ...also befindest Du dich auf einer Programmebene in Deinem Script...

          Ich denke schon...

          Wenn ich das Problem nicht auch unmittelbar im <body>-Tag hätte, sondern in einer weiteren eingebundenen php-Datei, dann hätte ich verschiedene Ebenen?

          Gruß
          Enrico

  3. Hallo,

    Jetzt funktioniert es, ohne dass ich irgendetwas geändert habe... ?!
    Obwohl ich zwischenzeitlich schon mehrmals den Browsercache geleert habe... ?!

    Muß ich das verstehen?

    Gruß
    Enrico