Klaus: include und ob_start()

Hallo,
also ich habe einen sehr komischen Fehler.

Und zwar habe ich eine Template Class. Sofern im Cache Ordner noch keine Datei vorhanden ist, wird das Template gelesen, in eine PHP Datei umgewandelt und in den Ordner gespeichert.

Anschließen wird diese per Include geladen.

Dort gibt es jetzt 2 Möglichkeiten: Sofort ausgeben, oder den Inhalt zurück geben.

Der Ausgabeprozess sieht so aus:

  
if(!file_exists($pfad)) die("Fehler");  
if($doOutPut == 1) @include("$pfad");  
else  
  {  
  ob_start();  
  include $pfad;  
  $return = ob_get_contents();  
  ob_end_clean();  
  
  return $return;  
  }  
return 0;  

Immer wenn ich den Inhalt zurück geben möchte, passiert etwas sehr komisches wenn ich den Inhalt zurück geben möchte. Falls vor dem Aufruf des Scripts die Cache Datei vorhanden ist, dann wird diese ganz normal geladen und auch zurückgegeben.

Falls sie nicht vorhanden ist, wird sie zuerst erstellt, und anschließend sollte der Inhalt zurückgegeben werden, was aber nicht passiert.
$return ist hierbei leer, obwohl die Datei existiert.

Wenn ich ob_start() etc. auskommentiere, so dass dort nur noch include $pfad; steht, dann wird die Datei ganz normal geladen, und direkt ausgegeben.

Beim nächsten Aufruf, wo die Cache Datei bereits existiert, funktioniert es mit der Rückgabe.

Kann mir jmd. sagen warum das so ist? Und was man dagegen machen kann?

MFG
Klaus

  1. Ich verbessere erst einmal deinen Code:

    if(!file_exists($pfad)) die("Fehler");

    if(!file_exists($pfad)){ die("Fehler, Datei existiert nicht"); }

    if($doOutPut == 1) @include("$pfad");

    if($doOutPut == 1){ include("$pfad"); }
    Das @ brauchst du nicht, weil das Skript hier nur ausgeführt wird, wenn $pfad auch wirklich existiert.

    else
      {
      ob_start();
      include $pfad;

    include("$pfad");

    $return = ob_get_contents();
      ob_end_clean();

    return $return;
      }
    return 0;

      
      
    Vielleicht liegt es einfach an dem fehlerhaften Code. Zur Lösung deines Problems kann ich leider nichts beitragen.
    
    1. echo $begrüßung;

      if(!file_exists($pfad)) die("Fehler");
         if(!file_exists($pfad)){ die("Fehler, Datei existiert nicht"); }

      Bei einem einzelnem Befehl werden keine {}-Block-Klammern benötigt.

      include $pfad;
           include("$pfad");

      Die Klammern und die Anführungszeichen sind überflüssig.

      echo "$verabschiedung $name";

      1. Bei einem einzelnem Befehl werden keine {}-Block-Klammern benötigt.
        Die Klammern und die Anführungszeichen sind überflüssig.

        Okay, dann darfst du mir ein "nicht hilfreich" geben

  2. echo $begrüßung;

    Kann mir jmd. sagen warum das so ist? Und was man dagegen machen kann?

    Auch mit dem Code-Ausschnitt kann man da nicht viel sagen außer den allgemeine üblichen Empfehlungen:

    • Schalte alle Fehlermeldungen, Warnungen und Notizen ein: error_reporting auf E_ALL setzen.
    • Lass dir an strategisch wichtigen Stellen den Inhalt der Variablen mittels var_dump() ausgeben und vergleiche die Ausgabe mit dem von dir erwarteten Inhalt. (Ein <pre> vorher verübersichtlicht ggf. die Ausgabe, htmlspechialchars() oder in den Seitenquelltext sehen hilft bei HTML/XML.)

    echo "$verabschiedung $name";

    1. Hallo,
      hab nen ganz dummen Fehler gehabt ^^

      Und zwar habe ich einmal vergessen, und zwar wenn die Cache Datei erstellt wurde, die Rückgabe in eine Variable zu speichern, die wiederrum am Ende der Funktion zurückgegeben wird.

      Grüße
      Klaus