Adrian: Kleinen Schönheitsfehler beheben

Hallo!

Ist NICHT so kompliziert wie es aussieht (denke ich).
Bitte nehmt euch nur die Zeit es durchzulesen, schwer ist es denke ich nicht.

Ich habe folgende Funktion:

  
function insert_usersonline() {  
  // Fehlermeldung bei fehlgeschlagener Verbindung zu $filename  
  $errormessage_open  = 'Fehler: Es konnte keine Verbindung zur'  
                      . "Datei hergestellt werden! \n          ";  
  // Fehlermeldung bei fehlgeschlagenem Lesen von $filename  
  $errormessage_read  = 'Fehler: Die Datei konnte nicht '  
                      . "gelesen werden! \n          ";  
  // Fehlermeldung bei fehlgeschlagenem Schließen von $filename  
  $errormessage_close = 'Fehler: Die Datei konnte nicht '  
                      . "geschlossen werden! \n          ";  
  // Fehlermeldung bei fehlgeschlagenem Erstellen des Ausgabestrings  
  $errormessage_output = 'Fehler: Die Ausgabe konnte nicht'  
                      . "erstellt werden! \n          ";  
  // Usersonlinedatei  
  $filename           = 'usersonline.txt';  
  // Ausgabestring  
  $usersonline_output   = '          ';  
  
  // Überprüfung und Ausgabe der Datei erfolgt  
  $fh = fopen($filename,'rb');  
  if(!$fh) {  
    // Fehlerausgabe aufgrund von fehlgeschlagenem Verbindungsversuch  
    echo $errormessage_open;  
  }  
  else {  
    // Inhalt von der Datei in $usersonline auslesen  
    $usersonline = fread($fh,filesize($filename));  
    if(!$usersonline) {  
      // Fehlerausgabe aufgrund von fehlgeschlagenem Leseversuch  
      echo $errormessage_read;  
    }  
    else {  
      // Zusammensetzen des Ausgabestrings  
      // Array der Einträge wird erstellt  
      $usersonline_array = explode(";",$usersonline);  
      // Schleife, um die Einträge von der Datei aneinanderzuhängen  
      for($x = 0; $x < count($usersonline_array); $x++) {  
        // Der aktuelle Arrayabschnitt wird angefügt  
        $usersonline_output = $usersonline_output . $usersonline_array[$x];  
        if(x < count($usersonline_array)-1) {  
          // Schleife ist noch nicht am Ende angelangt  
          $usersonline_output = $usersonline_output . "<br />\n          ";  
        }  
        elseif(x == count($usersonline_array)-1) {  
          // Schleife ist am Ende angelangt  
          $usersonline_output = $usersonline_output . "\n";  
        }  
        else {  
          // Der Wert ist größer als count($usersonline_array) (!!!)  
          echo $errormessage_output;  
        }  
      }  
      // Schließe Datei  
      $close_ok = fclose($fh);  
      if(!$close_ok) {  
        // Fehlerausgabe aufgrund von fehlgeschlagenem Schließversuch  
        echo $errormessage_close;  
      }  
      // Ausgabe des zusammengesetzten Ausgabestrings  
      echo $usersonline_output;  
    }  
  }  
}  

Diese Funktion soll den Inhalt folgender Datei ausgeben:

"usersonline.txt":
Test1;Test2;Test3

Im Quelltext der HP steht dann:

  
          Test1<br />  
          Test2<br />  
          Test3<br />  
                  </div>  

Es hat zwar keine Auswirkungen auf die Darstellung im Browser,
aber warum zeigt er nicht:

  
          Test1<br />  
          Test2<br />  
          Test3  
        </div>  

Wobei mir gerade auffällt, dass es so der Firefox anzeigt, wenn ichs aber markiere und hierherkopiere, fügt er das ein:

  
          Test1<br />  
          Test2<br />  
          Test3<br />  
  
                  </div>  

Warum auch immer... Was habe ich in der PHP-Funktion falsch geschrieben?

Mit freundlichen Grüßen,
Adrian

  1. Hallo Adrian,

    diesmal nur ein paar kleine Anmerkungen:

    Bei nur lesendem Zugriff (so wie hier) können Dir Funktionen wie file(), readfile() oder file_get_contents() viel Jonglierarbeit mit Filehandles abnehmen. Nutze sie!

    for($x = 0; $x < count($usersonline_array); $x++) {
            // Der aktuelle Arrayabschnitt wird angefügt

    Es gibt nicht nur explode(), es gibt auch implode(). Ergänze anschliessend ganz vorne und ganz hinten das, was noch fehlt.

    Weitere Tipps:
    Lasse Deine Funktion eine Zeichenkette zurückgeben und nehme die Ausgabe erst anschließend vor. So kannst Du Funktionen variabler und damit besser einsetzbar halten.
    Übergebe den Dateinamen der Funktion als Funktionsparameter.
    Gib jedem User seine eigene Zeile (diese Diskussion hatten wir ja schon einmal, wenn auch an anderer Stelle).

    Ach ja, "Halte Code links." in den sehr empfehlenswerten PHP-FAQ kann ich Dir auch noch ans Herz legen. Weiterhin viel Spass und Erfolg!

    Freundliche Grüße

    Vinzenz

  2. Hi,

    <snip>

    if(x < count($usersonline_array)-1) {
              // Schleife ist noch nicht am Ende angelangt
              $usersonline_output = $usersonline_output . "<br />\n          ";
            }
            elseif(x == count($usersonline_array)-1) {
              // Schleife ist am Ende angelangt
              $usersonline_output = $usersonline_output . "\n";
            }

    also: hier fehlt bestimmt ein $ (vor dem x) - und zwar an beiden Stellen. Dadurch wird vermutlich immer der Teil hinter dem if ausgeführt. Das elseif wird nie erreicht.

    und: Dieser Teil ist - meiner Meinung nach - nicht mehr nötig, da er sowieso innerhalb der Schleife nie erreicht wird. Ich bin ja auch ziemlich paranoid, aber nochmal zu prüfen, ob ein Schleifenzähler evtl. größer wird als in der Abbruchbedingung verlangt??

    else {
              // Der Wert ist größer als count($usersonline_array) (!!!)
              echo $errormessage_output;
            }

    </snip>

    liebe Grüße mbr

  3. echo $begrüßung;

    Ist NICHT so kompliziert wie es aussieht (denke ich).
    Bitte nehmt euch nur die Zeit es durchzulesen, schwer ist es denke ich nicht.

    Debugging ist meist zeitaufwändiger als kompliziert und gehört zum Programmieren dazu.

    Warum auch immer... Was habe ich in der PHP-Funktion falsch geschrieben?

    Das findest du sicher mit Debugging raus. Hier ein paar Hinweise dazu:

    • Setze das error_reporting auf E_ALL. Das kann man am Scriptanfang per Funktionsaufruf oder in der PHP-Konfiguration tun. Damit werden alle PHP-Fehlermeldungen ausgegeben. Besonders die Notice-Meldungen, die standardmäßig unterdrückt werden, geben oft wertvolle Hinweise auf Vertipper und Ähnliches.
    • Lass dir die Werte der Variablen, und die Rückgabeergebnisse der aufgerufenen Funktionen anzeigen. echo $variable; wäre ein Anfang, besser ist var_dump(), weil es auch gleich noch den Typ der Variablen ausgibt und im Gegensatz zu echo keine Konvertierung bei Ausgabe des Variableninhalt vornimmt. Letzteres ist beispielsweise bei boolschen Werten kontraproduktiv.
    • Vergleiche die ausgegebenen Werte mit den von dir erwarteten.

    echo "$verabschiedung $name";