MichaelR: Merkwürdiges Problem...

Hallo,

mir ist heute auf dem Produktivserver wieder ein Problem aufgefallen, das ich bisher noch nicht lösen konnte.

Ich baue die Webseite u.a. so auf, dass ich auch Textdateien HTML-Bestanteile über fopen(), fread() auslese und in die Webseite integriere.

Aus unterfindlichen Gründen wird nach dem Ausgeben dieser geladenen Elemente immer noch ein Stück vom PHP-Code mit ausgegeben; das ist nicht viel, z. B. vom Original Code

// check if data has been POSTed

wird folgendes ausgegeben

heck if data has been POSTed

Dabei ist es unabhängig ob es sich um PHP-Kommentare, PHP-Code, MySQL-Syntax oder sonst was handelt.

Ich hab sogar festgestellt, dass Code ausgegeben wird, der gar nicht in der aktuellen PHP-Datei vorhanden ist. Das obige Beispiel entstammt z. B. einer Datei testdatei_verarbeiten.php und ausgegeben wird das in testdatei.php.

Das Problem tritt -- meiner bisherigen Erfahrung -- nur dann auf, wenn über fread() Inhalt aus anderen Dateien eingefügt wird.

Der Server läuft mit PHP 4.4.2 auf einem AIX www 2 5 00CE8A4E4C00 System.

Hatte jemand schonmal so ein ähnliches Problem und hat hierfür Lösungsvorschläge? (Am System kann ich nichts verändern, das ist so Vorgabe).

Grüße+Danke
Michael

  1. Nachtrag,

    das Problem tritt sogar bei folgender Seite auf:

    <?php
     $strFileName = "../includes/admin/menu_structure.inc.txt";

    $Body = "";
      $Handle = fopen($strFileName, "r");
      if ($Handle !== false){
       //$this->Content = fread($Handle, filesize($strFileName));
       while (! feof($Handle)){
        $Body .= fread($Handle, 4096);
        }
       fclose($Handle);
       }

    print $Body;
    ?>

    Neben dem Inhalt der Textdatei wird auch folgendes ausgegeben:

    = mysql_query($sql)){

    Es ist vollkommen unersichtlich wo er das her hat. Es scheint als ob der Server irgendwas in einem Cache speichert und dann einfach mit ausgibt, aber wo????? Und warum???

    Grüße,
    Michael

  2. Hallo Michael,

    ohne wenigstens einen kleinen Code-Schnipsel ist es natürlich etwas schwierig, hört sich aber so an, also ob Du Dich eventuell mit den Anführungszeichen vertan hast, also " und ' verwechselt hast oder aber womöglich bei der Ausgabe ein " zum Öffnen verwendet und dann nicht mehr geschlossen hast. Das kann dann zur Ausgabe von dahinterstehendem PHP-Code führen, bis das nächste Anführungszeichen kommt und die Ausgabe beendet wird.

    Ich hoffe, das hilft Dir weiter.

    Viele Grüße,
    Bops

    1. Hallo,

      ohne wenigstens einen kleinen Code-Schnipsel ist es natürlich etwas schwierig, hört sich aber so an, also ob Du Dich eventuell mit den Anführungszeichen vertan hast, also " und ' verwechselt hast oder aber womöglich bei der Ausgabe ein " zum Öffnen verwendet und dann nicht mehr geschlossen hast. Das kann dann zur Ausgabe von dahinterstehendem PHP-Code führen, bis das nächste Anführungszeichen kommt und die Ausgabe beendet wird.

      Ich hoffe, das hilft Dir weiter.

      Leider nicht wirklich.

      Ja ich verwende überwiegend " um Strings, Dateinamen und dergleichen zu kennzeichnen, aber es sind alle geöffneten " auch wieder geschlossen. Ein Beleg hierfür ist schon darin zu sehen, dass das PHP-Skript komplett richtig ausgeführt wird.
      Ok mit Ausnahme, dass halt irgendwelche zusätzlichen Ausgaben erfolgen.

      Das Prozedere sieht so aus:
      -- Haupt-PHP-Datei, in der eine Variable $Content = "" deklariert ist
      -- $Content wird mit Inhalt gefüllt, z. B. dadurch dass eine txt Datei geladen und deren Inhalt übergeben wird
      -- am Ende des Skripts wird über print $Content ausgegeben

      Es ist so unerklärbar warum dieser Fehler auftritt, da
      -- er auch nicht auf jeder Seite auftritt (hauptsächlich, wenn ich Inhalt anderer Dateien nach obigem Schema einfüge)
      -- der String, der fehlerhaft hinzugefügt wird, ist so zufällig. Einmal wird PHP-Code ausgegeben, dann wieder PHP-Kommentar etc.

      Das gleiche Problem tritt z. B. auch bei folgender Situation auf. Ich hab mir zum Einfügen von Textdateien eine kleine Klasse geschrieben, die die Datei lädt und ein paar Ersetzungen vornimmt und letztlich den Inhalt dann zurückgibt, das sieht so aus:

      class IncLayoutComponents {
       var $Content = "";

      function IncLayoutComponents($strFileName){
        // load the file
        $Handle = fopen($strFileName, "r");
        if ($Handle !== false){
         $this->Content = fread($Handle, filesize($strFileName));
         fclose($Handle);
         }
       }

      function Replace($strPlaceholder, $strReplacement){
        $this->Content = str_replace("{".$strPlaceholder."}", $strReplacement, $this->Content);
       }

      function Remove($strMarker, $boolRemove){
        // remove only the markers
        if ($boolRemove == false){
         $this->Replace($strMarker.":", "");
         $this->Replace(":".$strMarker, "");
         }
         // remove the markers and their content
         else{
          // replace all occurances of the marker inclusion
          while (strpos($this->Content, $strMarker.":") !== false){
           if (strpos($this->Content, $strMarker.":") !== false){
            $StartPos = strpos($this->Content, $strMarker.":");
            if (strpos($this->Content, ":".$strMarker) !== false){
             $EndPos = strpos($this->Content, ":".$strMarker) + strlen($strMarker) + 3;
             $strTemp = substr($this->Content, 0, $StartPos-1) .
                  substr($this->Content, $EndPos+1);
             $this->Content = $strTemp;
             }
            }
           }
          }
       }

      function Get(){
        return $this->Content;
       }
      }

      Aufgerufen wird das Ganze so:

      $C = new IncLayoutComponents("relativer_Dateiname");
      // hier wird ein Platzhalter in der TXT Datei namens {strFormularFeldName} ersetzt durch den angegebenen Text
      $C->Replace("strFormularFeldName", "Inhalt");
      // hier wird ein Block von Inhalt aus der TXT entfernt, z. B.
      // {strRemove:}
      // all das hier wird entfernt ...
      //
      $C->Remove("boolRemove", true);

      print $C->Get();

      Also selbst bei diesem sehr überschaubaren PHP-Code wird nach $C->Get() noch zusätzliches Zeugs ausgegeben, was da nicht sein sollte.

      Und was ja eben komisch ist, auf meinem lokalen PHP-Server kommt dieser Fehler nicht vor, sondern nur auf dem Produktiv-Server im Netz...

      Bin am Verzweifeln....

      Grüße,
      Michael