Vinzenz Mai: Ich finde den Fehler nicht: ereg() und fwrite()

Beitrag lesen

Hallo Adrian,

Dein Quellcode ist nicht gerade sehr strukturiert dargestellt :-(
Kein Wunder, bin ja auch PHP-Anfänger... ;)

ich habe mir Deinen Code in Ruhe angeschaut und festgestellt, dass Du folgendes vorhast, die Notation ist in VMs eigenem Pseudo-Pseudocode gehalten :-)

Überprüfe Benutzername und Chatroom auf nicht erlaubte Zeichen
  Wenn nicht erlaubte Zeichen verwendet wurden
      Gebe eine Fehlermeldung aus
  Sonst
      Hänge einen Eintrag an eine bestimmte Datei an
      Informiere den Benutzer über diese Aktion
  Ende Wenn

Warum verwendest Du nicht für jeden Eintrag eine eigene Zeile?
Wie? Tue ich das nicht?

Nein, Du fügst nirgendwo in Deine Textdatei Zeilenenden, siehe PHP-Handbuch ein.

Über Konventionen zum Strukturieren von Quellcode kann man die schönsten Glaubenskriege führen, aber Du kannst Dir z.B. die PEAR Coding Standards anschauen.

Bei meiner Codeformatierung im folgenden Abschnitt spielt auch die Darstellung im Forum eine kleine Rolle, daher z.B. nur zwei Leerzeichen Einrückung :-)

  
// Ausgaben vorbereiten  
  
// Fehlermeldung bei Verwendung unerlaubter Zeichen für  
// den Benutzernamen und den Chatroom  
$errormessage = 'Fehler: Sie dürfen nur die Zeichen '  
        . 'a, b, c, d, e, f, g, h, i, j, k, l, m, '  
        . 'n, o, p, q, r, s, t, u, v, w, x, y, z, '  
        . 'A, B, C, D, E, F, G, H, I, J, K, L, M, '  
        . 'N, O, P, Q, R, S, T, U, V, W, X, Y, Z, '  
        . '0, 1, 2, 3, 4, 5, 6, 7, 8, 9 '  
        . 'verwenden für Ihren Username und den Chatroom!'  
  
// Benutzerdaten, die an die Logdatei angehängt werden  
$userdata      = 'Datum: ' . date("d.m.Y")  
        . ', Zeit: '                 . date("H:i:s")  
        . ', Zeitzone des Clients: ' . date("T")  
        . ', IP: '                   . getenv("REMOTE_ADDR")  
        . ', Username: '             . $_POST["username"]  
        . ', Chatroom: '             . $_POST["chatroom"]  
        . "\n";                      // Zeilenende!  
  
// Meldung, die der Benutzer über das Loggen seiner Daten erhält  
$userinfo      = "      Deine Daten sind erfolgreich aufgezeichnet worden:<br />\n      "  
        . $userdata;  
  
// Logdatei  
$filename      = "userips.txt";  
  
// Prüfung auf unerlaubte Zeichen  
// Verwendung von [link:http://www.php.net/manual/de/function.preg-match.php@title=preg_match()] statt [link:http://www.php.net/manual/de/function.ereg.php@title=ereg()],  
// wie von Christoph und dem PHP-Handbuch empfohlen.  
if(preg_match("/[^a-zA-Z0-9]*/", $_POST["username"].$_POST["chatroom"])) {  
  // mindestens ein unerlaubtes Zeichen wurde gefunden  
  // informiere den Benutzer darüber  
  echo $errormessage;  
}  
else {  
  // Öffne die Logdatei zum Anhängen  
  $fh = fopen($filename, 'a+');   # ja, Du kannst auch 'a+b' verwenden :-)  
  if(!$fh) {  
    // Diesen Fehler müsstest Du geeignet behandeln :-)  
    die("Diesen Fehler müsstest Du geeignet behandeln :-)\n");  
  }  
  
  // In einer Mehrbenutzerumgebung solltest Du an dieser Stelle  
  // versuchen, mit flock() einen exklusiven Schreibzugriff auf  
  // Deine Datei zu bekommen.  
  
  $write_ok = fwrite($fh, $userdata);  
  if ($write_ok) {  
    // Anhängen hat geklappt, informiere den Benutzer  
    echo $userinfo;  
  }  
  else {  
    // Fehler beim Schreiben in die Datei passiert  
    // müsste geeignet behandelt werden  
  }  
  
  [link:http://www.php.net/manual/de/function.fclose.php@title=fclose]($fh);  // Schliesse die Logdatei,  
  // wobei Du hier auch überprüfen solltest, ob die Aktion  
  // erfolgreich war, siehe Benutzerkommentare im PHP-Handbuch  
}  

Der Code ist noch lange nicht vorbildlich und insbesondere die Fehlerbehandlung noch sträflich vernachlässigt. Er sollte Dir einen Einblick geben, auf was Du beim Umgang mit Dateien achten musst. Jede Dateioperation kann prinzipiell fehlschlagen und Du solltest Dir überlegen, wie Du mit einem solchen Fehler am geschicktesten umgehst.

Entschuldigung, war nicht so gemeint. Es war nur, dass ich das Projekt für unseren Clan zum Ausprobieren mache und damit eigentlich bis Weihnachten fertig sein wollte/sollte. -.-

Na dann viel Erfolg dabei.

Freundliche Grüße

Vinzenz