Markus Trenker: Endlosschleife bei 'refresh' (HTML) versus 'include' (PHP)

Böse, böse Endlosschleife. Bitte, wer hat den Zaunpfahl?

In einer HTML-Datei ist eine Weiterleitung (refresh) eingebaut. Die Weiterleitung ruft eine PHP-Datei auf. Die PHP-Datei baut mit include() die oben genannte HTML-Datei ein.

Die PHP-Datei hört dann aber nicht mehr auf, den Refresh-Befehl der eingebundenen HTML-Datei auszuführen. Mit anderen Worten: Es entsteht eine Endlosschleife. HTML ruft PHP, PHP ruft HTML, HTML ruft PHP....

ICH WILL ABER KEINE ENDLOSSCHLEIFE.

Warum will ich die Umleitung überhaupt: Ich möchte, wenn ein Nutzer eine Unterseite aufruft, dass auch die dazugehörige Navigation geladen wird. Ruft also jemand text.htm auf, dann soll über navi.php die Datei text.htm an einer bestimmten Stelle einer Tabelle in die Datei navi.php eingebaut werden (Navi.php enhält die Navigation.)

Thx
Markus

  1. Hi Markus,

    Anstelle von dem Refresh muesstest Du mit einem Javascript auf der HTML Seite arbeiten, welches zuerst den Dateinamen prueft (also ob Du noch auf text.htm oder schon auf navi.php bist) - geht zB mit:

    top.location.href.substr(top.location.href.length-8, top.location.href.length)

    Und nur wenn es sich um text.htm handelt mit document.location.href auf navi.php umleiten.

    Gruss, Mel

  2. In einer HTML-Datei ist eine Weiterleitung (refresh) eingebaut. Die Weiterleitung ruft eine PHP-Datei auf. Die PHP-Datei baut mit include() die oben genannte HTML-Datei ein.

    Die PHP-Datei hört dann aber nicht mehr auf, den Refresh-Befehl der eingebundenen HTML-Datei auszuführen. Mit anderen Worten: Es entsteht eine Endlosschleife. HTML ruft PHP, PHP ruft HTML, HTML ruft PHP....

    Warum will ich die Umleitung überhaupt: Ich möchte, wenn ein Nutzer eine Unterseite aufruft, dass auch die dazugehörige Navigation geladen wird.

    Dein Konzept ist IMHO schon vom Ansatz her falsch. Wenn du in eine Seite etwas eingebunden haben willst, dann ist das refresh-Dingen der wahrscheinlich falscheste Weg, den man gehen kann.
    Mal abgesehen von der Schleife, die du damit logischerweise produzierst, lieferst du mit jedem Aufruf der HTML-Datei unvollständigen HTML-Code aus - anders als über ein offenes Ende kannst du die Navigation, die sich in der anderen Datei befindet, ja per include() nicht einbauen.

    Mach aus der HTML-Datei eine PHP- oder SSI-Datei. Dafür sind diese Mechanismen da.

    Gruß,
      soenk.e

  3. Moin

    ICH WILL ABER KEINE ENDLOSSCHLEIFE.

    Warum will ich die Umleitung überhaupt: Ich möchte, wenn ein Nutzer eine Unterseite aufruft, dass auch die dazugehörige Navigation geladen wird. Ruft also jemand text.htm auf, dann soll über navi.php die Datei text.htm an einer bestimmten Stelle einer Tabelle in die Datei navi.php eingebaut werden (Navi.php enhält die Navigation.)

    Woher soll die HTML-Datei auch wissen, ob sie umleiten soll oder nicht?

    Entweder du machst aus der HTML eine PHP-Datei und fügst die Umleitung (Meta-Tag?) nur ein, wenn sie nicht über die bisherige PHP-Datei aufgerufen wurde (das kannst du einfach durch Übergabe eines URL-Paramaters feststellen) oder du nimmst dir die HTML-Datei im PHP-Skript vor und operierst die Weiterleitung heraus.
    In etwa so:

    <?php
    ob_start();
    include("html-datei");
    $datei=ob_get_contents();
    ob_end_clean();
    echo preg_replace('/<meta http-equiv="refresh"[^>]+>/',"",$datei);
    ?>

    So, oder so ähnlich. (Du kannst natürlich auch eine langweilige fopen(), fread(), fclose()-Kombo oder file() verwenden :)

    --
    Henryk Plötz
    Grüße aus Berlin

  4. teile das ganze am besten in 2 Frames auf, auf der einen seite navi.php, auf der anderen text.html,wenn einer in der navi.php clickt, wird per javascript das 2.Frame aktualisiert und dann die navi.php mit den entsprechenden Parametern reloaded. und damit dürfte es keine probs geben

    Böse, böse Endlosschleife. Bitte, wer hat den Zaunpfahl?

    In einer HTML-Datei ist eine Weiterleitung (refresh) eingebaut. Die Weiterleitung ruft eine PHP-Datei auf. Die PHP-Datei baut mit include() die oben genannte HTML-Datei ein.

    Die PHP-Datei hört dann aber nicht mehr auf, den Refresh-Befehl der eingebundenen HTML-Datei auszuführen. Mit anderen Worten: Es entsteht eine Endlosschleife. HTML ruft PHP, PHP ruft HTML, HTML ruft PHP....

    ICH WILL ABER KEINE ENDLOSSCHLEIFE.

    Warum will ich die Umleitung überhaupt: Ich möchte, wenn ein Nutzer eine Unterseite aufruft, dass auch die dazugehörige Navigation geladen wird. Ruft also jemand text.htm auf, dann soll über navi.php die Datei text.htm an einer bestimmten Stelle einer Tabelle in die Datei navi.php eingebaut werden (Navi.php enhält die Navigation.)

    Thx
    Markus

  5. Moin!

    Böse, böse Endlosschleife. Bitte, wer hat den Zaunpfahl?

    <fuchtel> <fuchtel> BUMM! Leichte Schläge auf den Hinterkopf erhöhen das Denkvermögen. Reicht das so? ;)

    In einer HTML-Datei ist eine Weiterleitung (refresh) eingebaut. Die Weiterleitung ruft eine PHP-Datei auf. Die PHP-Datei baut mit include() die oben genannte HTML-Datei ein.

    Die PHP-Datei hört dann aber nicht mehr auf, den Refresh-Befehl der eingebundenen HTML-Datei auszuführen. Mit anderen Worten: Es entsteht eine Endlosschleife. HTML ruft PHP, PHP ruft HTML, HTML ruft PHP....

    ICH WILL ABER KEINE ENDLOSSCHLEIFE.

    Niemand will Endlosschleifen. :)

    Warum will ich die Umleitung überhaupt: Ich möchte, wenn ein Nutzer eine Unterseite aufruft, dass auch die dazugehörige Navigation geladen wird. Ruft also jemand text.htm auf, dann soll über navi.php die Datei text.htm an einer bestimmten Stelle einer Tabelle in die Datei navi.php eingebaut werden (Navi.php enhält die Navigation.)

    Irgendwo ist ein Denkfehler - entweder jetzt bei mir, weil du nicht die ganze Story erzählt hast, oder bei dir.

    Basierend auf dem, was du erzählst: Jemand ruft die text.html auf. Dann kriegt er folgenden Dateiinhalt:
    <!DOCTYPE...>
    <html>
    <head>
    <title>Eine Textseite</title>
    <meta refresh>
    <meta encoding>
    </head>
    <body>
    blah
    </body>
    </html>

    Damit wird er dann zu einer PHP-Datei umgeleitet, die (um deine Funktionalität zu bieten) mindestens mal so aussehen muß:
    <!DOCTYPE...>
    <html>
    <head>
    <title>Eine PHP-Seite</title>
    <meta encoding>
    </head>
    <body>
    <table>
    <tr>
    <td>
    Hier die Navigation
    </td>
    <td>
    <?

    Content einbinden

    include("text.html");
    ?>
    </td>
    </tr>
    </table>
    </body>
    </html>

    Wenn ich das mal überschlagsmäßig betrachte, dann kommt dabei Müll raus, weil du eine komplette HTML-Seite in eine komplette HTML-Seite einbaust.

    So, und jetzt kommt der Punkt, wo irgendjemand den Denkfehler macht: Entweder hast du deine entstehende Seite noch nicht auf Syntax geprüft, dann würdest du sehen, daß das kein korrektes HTML ist, weil sich in der Tabellenzelle eben mehr befindet als nur der Inhalt aus dem <body>, oder du hast eine Includefunktion geschrieben, die den Inhalt des Bodys aus der Textseite herausfiltert - dann sollte dir das Meta-Refresh aber doch eigentlich keine Probleme machen, weil es in der PHP-Seite garnicht auftaucht, oder?

    - Sven Rautenberg

  6. Allen Teilnehmern vielen Dank für die zahlreichen Antworten.

    THEMA: Einbinden von Dateien On-the-Fly (Serverseitig):

    Für den Vorschlag SSI (.shtml) habe ich mich vorläufig entschieden.

    JAVASCRIPT habe ich seit zwei Jahren in Verwendung und ich muss sagen, dass mein Log-File bei vielen Nutzern darauf hindeutet, dass sie JAVASCRIPT abgeschaltet haben. Deshalb kein JAVASCRIPT mehr.

    Bei PHP liegt einfach meinerseits ein Denkfehler vor, was mir natürlich schon mit Einstellen meiner Frage bekannt war.

    Meine Idee ist aber trotzdem so schlecht nicht:
    Wird eine Unterseite aus einer Suchmaschine aufgerufen, dann kann der Refresh-Befehl im Header die Variablen an die PHP-Datei weiterleiten. Vorteil: man muss den Aufbau einer Datei mit NAVIGATION nur einmal bestimmen und muss bei der Verlinkung der Datei nur ganz klassisch auf Namen und ggf. Verzeichnis verweisen. Für die Pflege von Sites ein ganz wichtiges Argument. Der Vorschlag, hier den Header der Unterdatei herauszuschneiden, damitt der Refresh-Befehl beim Einbinden nicht fortwährend ausgeführt wird ist deshalb sehr gut.

    Den Vorschlag SSI habe ich mir angeschaut. Der ist auch sehr schön, gerade deshalb, weil SSI Möglichkeiten vorhält, die Problematik der Unterdateien mit einfachen Mitteln beheben (www.ideenreich.com/programmierung/ssi_10.shtml), ohne dabei die Pflege des Webauftritts unnötig auszuweiten.

    Insofern verfolge ich derzeit den Weg über SSI.

    Danke
    Markus Trenkler