PHP ob_start() bei Redirect

qhil

Captain
Registriert
Apr. 2011
Beiträge
3.119
Moin zusammen,

ich habe derzeit das Problem, dass ich über
PHP:
Header(Location: xyz.php);
einen Redirect machen möchte. Dummerweise funktioniert dies nicht, weil sich davor schon Ausgaben befinden. Das kommt, weil ich eine Hauptseite habe, wo je nach ausgewähltem Menüpunkt und damit gesetzer Variable eine entsprechende PHP-Datei included wird. Dadurch muss ich das Grundgerüst nicht immer wieder in jede Datei aufnehmen.

Wie auch immer, der Redirect funktioniert dann natürlich nicht. Die Lösung mit dem Puffern der Ausgabe über
PHP:
ob_start();
funktioniert auch, nur stelle ich mir die Frage, ob das korrekter Programmierstil ist. Mir erscheint das irgendwie "dahingefuscht" :) Außerdem würde ich gern wissen, ob man unbedingt mit
PHP:
ob_end_flush();
abschließen muss, weil der Inhalt wird auch ohne den Befehl ausgegeben. Sollte man zusätzlich den Inhalt noch mit
PHP:
 ob_end_clean();
löschen oder ist das egal?


Viele Dank im Voraus,
qhil
 
Das kommt dir "dahingepfuscht" vor, da korrekter Programmierstil wäre, ein Framework/Templatesystem zu verwenden dass alle Ausgaben am Ende ausführt/bündelt ;)
Nach ob_end_flush brauchst du kein ob_end_clean mehr. Du hast verschiedene Möglichkeiten des Beenden des Output-Buffers, end_flush gibt aus, end_clean verwirft, get_flush gibt zurück (als Variable). Eine davon ist aber immer ausreichend.
 
Mh, dann wäre es wohl sinnvoller, wenn man ein Script hat, wo das Grundgerüst eingebunden wird. Also andersrum... naja, ich werde das nun nicht alles umstricken, für die Zukunft wird es aber bedacht.

Das bedeutet aber, dass man den Befehl verwenden kann? Muss ich mir also keine weiteren Gedanken machen?
 
Nein, der Befehl ist völlig in Ordnung. Auch ist das so herum in Ordnung wie du es gemacht hast (Grundgerüst, das andere Dateien includiert.) Ich meinte eher, dass die Logik (welche Redirects ausgeführt werden, was eingebunden werden soll, etc.) zu Beginn abgearbeitet wird, und die jeweiligen Ausgaben dann anschließend. (In Richtung MVC-Prinzip)

Aber ob_end_flush bzw. Output-Buffer allgemein ist/sind völlig legitim! Du bist aber nicht auf ob_end_flush limitiert, du hast viele Möglichkeiten. (Es ist sogar z.B. möglich mehrere Output Buffer ineinander zu verschachteln)
 
Minibeispiel:

Code:
<?php

switch ($_GET['inc']) { 

           case news :
           $logic    = '/var/www/news.php.inc';
           $template = '/var/www/templates/news.php';
           break;
        
           // append here //

           default :
           $logic    = '/var/www/start.php.inc';
           $template = '/var/www/templates/start.php';
           break;

}



require $logic;
?>


<!DOCTYPE html>
<html>
<body id='fx-start'>

            <?php require $template; ?>

</body>
</html>



Zuerst alle Berechnungen durchführen und die Variablen erzeugen und erst danach das entsprechende Template einbinden und das html erzeugen.
 
Alles klar. Danke für die Hilfe :)
 
Zurück
Oben