Richard: zweimal include, jeweils andere Variable, immer der gleiche Aufruf

Tach,

ich habe folgendes Problem. Ich binde über include

$beispiel_var=1;

include("page_rechnen.php");

folgende Seite auf.

Anschließend ändere ich bestimmte Variablen und rufe sie erneut auf:

$beispiel_var=2;

include("page_rechnen.php");

Die include Seite wird zwar zweimal geladen, doch der Wert, der zweiten Var wird nicht überschrieben und auch nicht übermittelt.. Wie stelle ich es an, das beim zweiten Aufruf, auch mit den neuen Variable gearbeitet wird?

Richard

  1. Hallo,

    $beispiel_var=1;

    include("page_rechnen.php");

    folgende Seite auf.

    das heißt, du bindest eine weitere Quelldatei mit include() ein, deren Code sofort ausgeführt werden soll. Guter Programmierstil ist das aber nicht. Der Normalfall ist eher, dass man eine Datei nur einmal includiert und eine darin definierte Funktion mehrmals aufruft. Dann ist auch die Übergabe von Parametern bzw. des Ergebnisses eindeutig.

    Anschließend ändere ich bestimmte Variablen und rufe sie erneut auf:

    $beispiel_var=2;

    include("page_rechnen.php");

    Die include Seite wird zwar zweimal geladen, doch der Wert, der zweiten Var wird nicht überschrieben und auch nicht übermittelt.. Wie stelle ich es an, das beim zweiten Aufruf, auch mit den neuen Variable gearbeitet wird?

    Was genau steht in page_rechnen.php, und was genau meinst du mit übermitteln?

    Live long and pros healthy,
     Martin

    --
    Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen.
    1. Je nachdem welcher Wert übermittelt wird, wird eine andere Ausgabe in dieser Datei zusammengesetzt. Ich übermittel eine einzige Zahl

      1. Hallo,

        Je nachdem welcher Wert übermittelt wird, wird eine andere Ausgabe in dieser Datei zusammengesetzt. Ich übermittel eine einzige Zahl

        Mir scheint du brauchst include eigentlich gar nicht. Schau dir mal an was und wofür Funktionen sind!

        Gruß
        Kalk

  2. Hallo Richard,

    die Kollegen haben schon recht: mehrfache Includes müssen nicht sein. Aber mal davon ab, das, was Du tust, sollte im Rahmen dessen, was Du uns hier erzählst, funktionieren. Ich habe ein Beispiel gemacht:

    master.php:

    <?php
    echo "I am your Master\n";
    $obey = 1;
    include("slave.php");
    $obey = 2;
    include("slave.php");
    echo "I am done now.\n";
    

    slave.php:

    <?php
    if ($obey == 1)
       echo "  I am your obediant servant!\n";
    else if ($obey == 2)
       echo "  Command me, Master!\n";
    else
       echo "  You're pathetic...\n";
    

    Ausgabe:

    I am your Master
      I am your obediant servant!
      Command me, Master!
    I am done now.
    

    Der Mechanismus, den Du verwenden willst, funktioniert. Mit PHP 5.6 und mit PHP 7.4. Wenn die includete Datei bei Dir nicht der geänderten Variablen aus der Hauptdatei folgt, machst Du etwas anderes falsch.

    Tipp: Gib ganz zu Beginn der Include Datei den Wert von $beispiel_var aus. Und da, wo Du sie abfragst, tu das in der Zeile davor nochmal.

    Zum Verbesserungsverfahren. Mal angenommen, deine Include-Datei hat den Job, je nach Wert von $beispiel_var ein bestimmtes HTML Fragment in der einen oder anderen Variante auszugeben. Das kann man so tun wie in meinem albernen slave.php Beispiel oben. An Stelle der echo kann man auch den PHP Kontext verlassen, das ist ganz praktisch für das Syntax-Highlighting, wenn die Ausgabe HTML enthält (ob das Beispiel praktisch ist, möge dahingestellt bleiben):

    <?php if ($beispiel_var == 1): ?>
    <label>Alter: <input type="number" name="alter"></label>
    <?php elseif ($beispiel_var == 1): ?>
    <label>Geburtsdatum: <input type="text" name="gebdat"></label>
    <?php endif; ?>
    

    (if mit Doppelpunkt und endif?!?! -> alternativsyntax für kontrollstrukturen, bei einem PHP/HTML Mix zu empfehlen)

    Man kann aber auch in einer Funktion HTML ausgeben und auch den PHP Kontext verlassen:

    <?php
    function eingabeAlter($modus) {
       if ($modus == 1):
    ?>
    <label>Alter: <input type="number" name="alter"></label>
    <?php 
       elseif ($beispiel_var == 1):
    ?>
    <label>Geburtsdatum: <input type="text" name="gebdat"></label>
    <?php
       endif;
    }
    

    Im aufrufenden Script steht dann:

    require_once "input_widgets.php";
    
    ...
    
    eingabeAlter(1);
    
    ...
    
    eingabeAlter(2);
    

    Was nicht heißt, dass ich das im konkreten Fall empfehlen würde. Wenn man ein Include hat, das eine Sammlung von Funktionen zum Ausgaben von input-Gruppen enthält, dann würde ich nicht eine Funktion mit Fallunterscheidung darin bereitstellen, sondern zwei Funktionen schreiben: eingabeAlter und eingabeGeburtsdatum.

    Rolf

    --
    sumpsi - posui - obstruxi
  3. Tach!

    Die include Seite wird zwar zweimal geladen, doch der Wert, der zweiten Var wird nicht überschrieben und auch nicht übermittelt..

    Das scheint mir ein Verständnisfehler zu sein. include ist keine Funktion, die man aufruft, der man was übergibt, und die ein Ergebnis liefert oder per Nebenwirkung zum Beispiel eine Ausgabe erstellt. Stattdessen wird der Code in der Include-Datei sozusagen an die aufrufende Stelle eingefügt und im Kontext des Aufrufs ausgeführt.

    Oder in anderen Worten: Du übergibst nicht eine Aufgabe an einen Kollegen, die er in seinem Büro erledigt, sondern holst den Kollegen zu dir, dass er die Aufgabe bei dir im Raum ausführt.

    dedlfix.

    1. Hallo dedlfix,

      hast ja recht, aber wenn ich den dienstbaren Kollegen hole und ihm sage: Tu, was da auf der Tafel steht, dann sollte er das tun. Wenn ich die Tafel auswische, was anderes draufschreibe und ihn dann nochmal hole, dann sollte er nicht tun, was beim ersten Mal auf der Tafel stand.

      Tut er auch in meinem Beispiel nicht. Bei Richard dagegen schon. Und da hilft dann nur debuggen.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Tach!

        hast ja recht, aber [...]

        Schon klar, auf das eigentliche Thema gingen ja schon die anderen Antworten ein. Ich wollte nur noch klarstellen, wie sich include eigentlich verhält. Im übrigen stimme ich darin überein, dass sich die Aufgabenstellung eher so liest, das eine Funktion die bessere Lösung ist.

        dedlfix.