nochmal zum Thema: board includen.

blubber

Erfahrenes Mitglied
Hallo (speziell an Virus und reima :) )

ihr könnt euch doch bestimmt noch an mein Problem mit dem Board erinnern. Mittlerweile hab ich gemerkt, dass es doch nicht so einfach geht, wie ich das erst dachte, also einfach ddie inxheader NACH der global.php zu includen. Grund: die global.php wir auf einer Site mehrmals includet, also in if abfragen, und manchmal kommt es immernoch vor, dass deshalb eine fehlermeldung entsteht. Auf der vbulletin site steht auch, dass man das irgendwie mit diesem ob_start und ob_end_flush lösen soll, doch wie genau, hab ich nicht herausfinden können. Das war ja dein Vorschlag, reima:

PHP:
<?php
ob_start();
include("inxheader.php");
[...]
include("inxfooder.php");
ob_end_flush();
?>

Doch wie gesagt, das funktioniert leider nicht. Was machen die beiden ob befehle denn ganz genau??

Ich hatte mal dem webmaster von tutorials eine email geschickt, und genau diese frage gestellt. Als Antwort erhielt ich folgendes:

so wirds bei uns gemacht:

ob_start();
require("head.inc.php");
$head = ob_get_contents();
ob_end_clean();

doch wo muss ich das nun einsetzten? was ist mit der footer? MUSS die headerdatei head.inc.php heissen?

und vor allem, was bringt die $head variable. Ihr seht, ich konnte damit noch nicht wirklich viel anfangen, aber vielleicht hat von euch einer eine Idee. Irgendwie muss das doch funtzen :)

bye
 
..

ein vBulletin Board.
Und in so ziemlich jeder php datei includet er (mehrfach) eine global.php datei. Diese wiederum includet die functions.php, in der ein cookie gesetzt wird. Und wie schon im letzten Thema erwähnt, darf man vor so einem set_cookie kein html zeugs haben. Das ist das Problem, man kann nicht einfach an jeden anfang der php siten eine header includen. Aber es muss irgendwie mit dem ob_start usw. funtzen.

bye
 
Also, ich versuche dieses Buffering per ob_* mal zu erklären:
Die Funktion ob_start() ändert sozusagen die Standartausgabe. Anstatt die Ausgaben (z.B. per echo oder print) direkt an den Browser zu senden, werden diese in einer internen Variable gespeichert. Folgendes Script würde also rein gar nichts ausgeben:
PHP:
<? ob_start(); echo "Output Buffering ist an!"; ?>
Warum, sollte klar sein. ob_start startet das Buffering. Der Aufruf von echo sendet den übergebenen String nicht an den Browser, sondern speichert ihn in die interne Buffer-Variable.
Die Funktionen ob_end_* beenden dieses Ausgabeverhalten. Dabei gibt es zwei Möglichkeiten: ob_end_clean löscht lediglich den internen Buffer und sorgt dafür, dass die folgenden Ausgaben wieder direkt an den Browser gesendet werden. ob_end_flush gibt zusätzlich noch vorher den Inhalt der Buffer-Variable aus.
ob_get_contents gibt als return-Wert den aktuellen Inhalt der Buffer-Variable zurück. Die folgenden beiden Aufrufe sind also praktisch äquivalent:
PHP:
<? ob_end_flush(); ?>
PHP:
<? $buffer = ob_get_contents(); ob_end_clean(); echo $buffer; ?>
Und jetzt die große Ausnahme, der entscheidende Punkt: Header-Informationen bleiben vom Buffering unbeeinflusst. Ein Aufruf wie z.B. header("Location: http://www.abc.de/xyz.html"); wird nachwievor direkt gesendet. Ebenso das Setzen eines Cookies, was ja auch über den Header geschieht.
Ich hoffe, dass das einigermaßen verständlich war. Falls nicht, einfach nochmal nachfragen :)

Das von dir gepostete Snippet würde also folgendes machen:
PHP:
<?php
// Output Buffering anschalten:
ob_start();
// head.inc.php einbinden. Alle Ausgaben innerhalb dieser Datei werden in den Buffer geschrieben:
require("head.inc.php"); 
// Der Inhalt des Buffers wandert in die Variable $head:
$head = ob_get_contents(); 
// Das Buffering wird ohne Ausgabe des Zwischenspeichers beendet:
ob_end_clean(); 
?>

Ich glaube, dass das so gemeint ist, dass man für jeden Teil der Page diese Prozedur durchführt. Am Ende sind dann bereits alle notwendigen Cookies gesetzt, und man hat im Idealfall den Quelltext in drei Variablen, die dann über
PHP:
<? echo $head.$content.$foot; ?>
ausgegeben werden.

Hope that helps :)


reima
 
Zuletzt bearbeitet:
Zurück