Kleinen Schönheitsfehler beheben
Adrian
- php
1 Vinzenz Mai0 mbr0 dedlfix
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
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
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
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:
echo "$verabschiedung $name";