Kurs:Ein Internetchat mit PHP/Eingabe von Chattexten

Das Eingeben eines Chatbeitrags geschieht durch den Client via Webbrowser. Ebenso soll die Eingabe eines Namens, unter dem der Beitrag erscheint, unterstützt werden. Auf dem Server werden diese Informationen mit Hilfe der Skriptsprache PHP in eine Chatdatei gespeichert und zur Ausgabe bereitgehalten.

Hier wird die Eingabe der Chatbeiträge mittels PHP behandelt.

Die Chat-Datei Bearbeiten

Wie bereits im Kursmodul Ausgabe von Chattexten angeführt, werden alle Chatbeiträge in eine Textdatei in Zeilenform mit allen gewünschten Daten abgelegt.

Die Eingaben des Chatters Bearbeiten

Um die einzelnen Chatbeiträge nicht nur Zahlen in Form von IP-Adressen zuordnen zu müssen, soll zu Beginn einer Chatsitzung ein Nutzername (auch als Spitzname, englisch: "Nickname", bezeichnet) eingegeben werden. Danach können die Chatbeiträge unter diesem Namen eingegeben werden.

Die Chatbeiträge sollen an eine Datei namens chat.txt angehängt werden, da sie aus eben dieser Datei in umgekehrter Reihenfolge wieder den Chattern angezeigt werden (siehe Kursmodul Ausgabe von Chattexten).

Die Datei „input.php“ Bearbeiten

Da PHP-Anweisungen, wie bereits im Modul Grundstruktur eines PHP-Dokuments behandelt, innerhalb von HTML-Anweisungen eingebettet werden, enthält auch die Eingabedatei ein übliches HTML-Gerüst:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
 <head>
  <title>Chat-Eingabe</title>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
 </head>
 <body>
  ...
  ...
  ...
 </body>
</html>

Der Kopfbereich (engl. Header) der Datei enthält außer dem Titel zusätzlich die Meta-Anweisung zur Kennzeichnung des verwendeten Zeichensatzes.

Aufgabe:
Die Datei input.php ist im oben dargestellten Umfang zu erstellen. Überprüfen Sie das Ergebnis durch Aufruf der Datei chat.html im Webbrowser mittels der Adresse http://localhost/chat.html.

Hinweis: Da im HTML-Dokument für die Eingabe noch kein tatsächlicher Inhalt vorhanden ist, sollte im unteren Frame-Bereich eine leere Seite angezeigt werden (eventuell sind dort ja die dreifachen Punkte zu finden?). (siehe: Framedarstellung mit unterem "leerem" HTML-Dokument)

Ab Zeile 09 kann nun das per HTML-Formular zu realisierende Eingabefeld erzeugt werden.

Das Eingabeformular Bearbeiten

In Webseiten werden Eingabefelder mit Hilf von HTML-Formularen erzeugt. Solche HTML-Formulare enthalten als Minimalvariante:

  1. den Formularbeginn
  2. diverse Textpassagen und Eingabefelder
  3. die Schaltfläche für das Absenden der Daten
  4. das Formularende

Für unsere Chateingabe soll ein Nutzername und danach die Eingabe des Chatbeitrags möglich sein. Für beide Fälle wird der Formularbeginn, die Absenden-Schaltfläche und das Formularende identisch sein. Einzig der lesbare Text und das Eingabefeld werden unterschiedlich sein. Somit kann der Formularabschnitt in der input.php-Datei bereits skizziert werden:

  <form method="post" action="input.php">
  ...
  ...
   <input type="submit" value="Absenden" />
  </form>
Aufgabe:
Die Datei input.php soll soweit erstellt werden, dass das Formular im HTML-Code, wie oben angegeben, definiert wird und eine Absenden-Schaltfläche vorhanden ist.

Hinweis: Es wurden zwar noch keine Eingabefelder deklariert, aber immerhin sollte nun bereits die Absenden-Schaltfläche zu sehen sein. (siehe: Framedarstellung mit "leerem" Formular im unteren HTML-Dokument)

Der Formularinhalt Bearbeiten

In der oben dargestellten Zeile 01 wird ein HTML-Formular definiert, wobei als Methode für das Übertragen der Daten vom Client zum Server die „POST“-Variante gewählt wurde.[1] Wenn vom Benutzer die in Zeile 04 definierte Absenden-Schaltfläche[2] betätigt wird, werden sämtliche Formulardaten an das im „action“-Attribut des Formulars angegebene Skript gesendet - also wieder an die Datei „input.php

Zwischen die obigen Zeilen 01 und 04 muss nun noch die Programmlogik eingefügt werden, damit die Eingabefelder korrekt angezeigt werden und die Formulardaten korrekt ausgewertet werden können.

Auswertung von Formulardaten Bearbeiten

Wie werden nun Formulardaten aus eine HTML-Formular an PHP übergeben?

Bei Formularen, die die POST-Methode verwenden, besteht die Möglichkeit, die eingegebenen Formulardaten im PHP-Skript aus einem Array[3] mit dem vorgegebenen Namen $_POST zu entnehmen.

Für unsere Zwecke benötigen wir zwei Werte aus diesem Array:

  1. den Nutzernamen - dafür verwenden wir im weiteren Verlauf die Bezeichnung „user
  2. den Chatbeitrag - dafür verwenden wir im weiteren Verlauf die Bezeichnung „entry

Damit PHP diese Informationen auswerten kann, verwenden wir benannte Eingabefelder, das sind HTML-Eingabefelder mit dem „name“-Attribut.

Abfrage des Nutzernamens Bearbeiten

Solange PHP nichts von einem Nutzernamen weiß, wird das Formular zur Abfrage des Nutzernamens verwendet. Der Nutzername kann in PHP über das Array-Element $_POST['user'] abgefragt werden. Nachstehend folgt der PHP-Codeabschnitt zur Generierung des Eingabefeldes für Nutzernamen:

  ...
   <?php
    $user = htmlspecialchars(trim($_POST['user']));
    if ( strlen($user) == 0 || strlen($user) > 10 ){
   ?>
     <b>Dein Nick:</b> <input type="text" name="user" size="10" maxlength="10" />
   <?php
    }else{
  // ...weitere Anweisungen...
    }
   ?>
  ...

Falls überhaupt ein Nutzername angegeben wurde, wird in der Zeile 03 mit Hilfe des Array-Elements $_POST['user'] der übergebene Nutzername entnommen. Sollte bisher noch kein Nutzername bekannt sein, ist dies eben die leere Zeichenfolge. Die PHP-Funktion trim[4] entfernt vorangehenden und abschließenden Leerraum. Mit der PHP-Funktion htmlspecialchars[5] werden eventuell vorhandene Sonderzeichen, die im HTML-Dokument Verwirrung auslösen könnten, entschärft - entsprechend dem Motto:

Traue nie einer Nutzereingabe!

Das Ergebnis des zusammengestrichenen und entschärften Nutzernamens wird in der PHP-Variablen $user zwischengespeichert.

In Zeile 04 soll nun die Länge dieses Nutzernamens mittels der PHP-Funktion strlen[6] kontrolliert werden. Falls die ermittelte Länge einen Wert ergibt, der gleich Null oder größer Zehn ist[7], werden die direkt auf die if-Anweisung[8] folgenden Zeilen abgearbeitet.

Falls also kein Nutzername bekannt ist, wird durch Zeile 06 der HTML-Text: Dein Nick: gefolgt von einem Texteingabefeld an den Webbrowser gesendet. Das Eingabefeld trägt das Attribut name="user". Dadurch wird beim Absenden der Formulardaten der als Nutzername eingegebene Wert an PHP übergeben. Die weiteren Attribute dieses Eingabeelements beschränken die Zeichenlänge des Nutzernamens auf 10 Zeichen.

In der Zeile 08 wird der Anweisungsblock der if-Anweisung beendet und im else-Zweig können weitere Anweisungen folgen.

Einlesen des Chatbeitrags Bearbeiten

Für den Fall, dass der Nutzername korrekt erkannt und akzeptiert wurde, soll ein unter diesem Namen geschriebener Beitrag an unsere chat.txt-Datei angehängt und der Nutzername gefolgt von einem Eingabefeld für bis zu 80 Zeichen für den nächsten Chatbeitrag bereitsgestellt werden. Diese Programmlogik entspricht also dem else-Zweig aus dem vorangehenden Programmcode:

    if ( strlen($user) == 0 || strlen($user) > 10 ){
  // ...Anweisungen falls Nutzername erfragt werden soll...
    }else{
     $entry = htmlspecialchars(trim($_POST['entry']));
     if (strlen($entry)>0){
      $entry=substr($entry,0,80);
      $chatfile=fopen('chat.txt','a');
      fputs($chatfile,
       Date("H:m.i").
       " ".$_SERVER['REMOTE_ADDR'].
       " $user > $entry\r\n"
      );
      fclose($chatfile);
     }
     echo "<b>$user</b>";
   ?>
    <input type="hidden" name="user" value="<?php echo $user; ?>"/>
    <input type="text" name="entry" size="80" maxlength="80" value=""/>
   <?php
    }
   ?>
  ...

Ab Zeile 04 des obigen Programmcodes beginnt die Übernahme des Chatbeitrags und der Speicherung des Textes. Wie in Zeile 4 zu sehen, wird der Text des Chatbeitrags wieder aus dem Array mit dem speziellen Namen $_POST entnommen, wobei hier das Array-Element namens entry ausgelesen wird. Auch hier werden eventuell vorhandene Leeräume und Sonderzeichen mit Hilfe der PHP-Funktionen trim und htmlspecialchars "entschärft".

Sollte nun noch etwas zum Speichern übriggeblieben sein, was in der Zeile 05 überprüft wird, dann wird in Zeile 06 der Beitrag auf die zulässige Länge von max. 80 Zeichen zusammengestrichen.

Zeile 07 öffnet die Datei für die Chatbeiträge namens chat.txt mittels der PHP-Funktion fopen. Diese Funktion erwartet als zweiten Aufrufparameter den Modus des Dateizugriffs. Ein a öffnet die Datei im Append-Modus - also zum Hinzufügen von Datensätzen. Vorteilhafterweise wird die Datei auch gleich angelegt, sollte es sie noch nicht geben. Im angegebenen Programmcode sind nun zwei HTML-input-Tags enthalten. Einmal vom Typ hidden, zur (unsichtbaren) Übergabe des aktuellen Nutzernamens und ein zweites mal als Eingabefeld mit dem Namen entry zur Entgegennahme des Chatbeitrags.

Ab Zeile 08 wird nun der aufbereitete Chatbeitrag durch die PHP-Funktion fputs in die zuvor geöffnete Datei geschrieben. Dabei wird zuerst die aktuelle Zeit (Zeile 08), gefolgt von der IP-Adresse des Nutzers (Zeile 09) und dessen Namen sowie dessen Beitrag und abgeschlossen durch einen Zeilenwechsel (Zeile 10) ausgegeben.

In Zeile 13 wird die Datei chat.txt ordnungshalber wieder geschlossen.

Zeile 15 dient der Ausgabe des Nutzernamens im Eingabebereich des Chatbeitrags. Wie in Zeile 17 zu sehen, wird der aktuelle Nutzername serverseitig mit Hilfe der PHP-Anweisung echo in das HTML-Tag eines input-Feldes vom Type hidden eingesetzt. Auf diese Weise wird auch bei der nächsten Verbindung des Clients mit dem Server der Nutzername weitergereicht und der Nutzer muss sich nicht jedesmal von Neuem einen Namen geben.

Das eigentliche Eingabefeld für den Chatbeitrag ist in Zeile 18 zu sehen, wobei hier die Eingabe auf maximal 80 Zeichen beschränkt wird. Das Eingabefeld trägt das Attribut name="entry", um den Chatbeitrag serverseitig unter diesem Namen entgegennehmen zu können.

Die Ergebnisdatei Bearbeiten

Referenzen Bearbeiten

  1. Formulare bei „de.SelfHTML.org“
  2. ebenda: Formularbuttons
  3. Arrays in PHP
  4. Zeichenkettenfunktion: trim
  5. Zeichenkettenfunktion: htmlspecialchars
  6. Zeichenkettenfunktion: strlen
  7. logische Operatoren
  8. Kontrollstruktur: if