wollte mal mein kleinen mit PHP geschriebenen Chat posten.
function chatoutput()
{
////Zuerst wird auf gesetzen Werten der Variablen geprüft,
////also ob eine Nachricht überhaupt abgesendet wurde!if (isset($_REQUEST['input']) && $_REQUEST['input'] != "") {
////////Wenn Werte gesetzt sind,
////////wird der Nickname und ein Zeilenumbruch definiert.$_REQUEST['nick'] = "Nickname: ";
Kann man da nur mit sich selbst reden?
$breaker = "\n";
}
////Dann wird eine Textdatei(txt) geöffnet bzw. erstellt.$textfile = @fopen("text.txt", "a+");
Unterlasse es bitte in Deinem eigenen Interesse, Fehlermeldungen gänzlich zu unterdrücken, Fehlermeldungen sind eine Hilfe. Dass Du sie nicht in der ausgegebenen Seite haben willst, ist verständlich, weshalb dieser Ausgabeweg auf gut eingerichteten Servern eigentlich auch ausgeschaltet sein sollte, siehe http://www.php.net/manual/de/ref.errorfunc.php: display_errors ausgeschaltet, log_errors eingeschaltet.
////Und es werden in der Reihenfolge "Nickname, abgesendeter Text,
////und ein Zeilenumbruch" in jeweils eine Zeile der Textdatei geschrieben.
////(Danach wird sie wieder geschlossen.)fwrite($textfile, $_REQUEST['nick']. $_REQUEST['input']. $breaker);
Und warum bist Du Dir so sicher, dass die Datei geöffnet wurde? Eine Fehlerbehandlung hast Du jedenfalls nicht gemacht. Extrem schlecht.
Außerdem hast Du Dich nicht gegen übermittelte Zeilenumbrüche abgesichert. Die kann man zwar nicht in einem input-Feld eingeben, aber das bedeutet noch lange nicht, dass nicht irgendein Scherzkeks sie trotzdem einschmuggelt.
fclose($textfile);
////Ab hier wird nun die Textdatei in ein Array geschrieben.
$text = file('text.txt');
Es ist nicht unbedingt schlau / effizient, dieselbe Datei innerhalb eines Durchlaufs zweimal zu öffnen.
foreach ($text as $line => $output) {
if ($line < 10) {////////////Mittels Durchlaufen des Arrays können alle eingegebenen Daten
////////////von der Textdatei per Echo als Chatausgabe ausgegeben werden.
Dummerweise gibst Du immer nur die ersten zehn Zeilen aus, anstatt Dich lieber um die letzten zehn, also die neuesten zu kümmern.
echo $output;
Und was passiert, wenn ich als Text '<script type="text/javascript">window.location.href="http://rotten.com";</script>' eingegeben habe? Befasse Dich mit der Funktion htmlentities() und gewöhne Dir an, alles, aber wirklich alles, was von draußen kommt, mit entsprechender Vorsicht zu behandeln.
}
////////Wenn über 10 Zeilen gesendet wurden,
////////wird der Dateizeiger wieder auf den Anfang der Textdatei resetet.
else {
@fopen("text.txt", "w+");
fclose("text.txt");
Jetzt machst Du die Datei zum dritten Mal wieder auf und löscht zudem alle Einträge anstatt nur die ältesten je nach Bedarf rauszuschmeißen.
Versuche, die Datei nur einmal zu öffnen, indem Du am Anfang alles per file() einliest, die Änderungen an dieser Variablen durchführst und sie abschließend in die Datei zurückschreibst (Tipp: fseek()).
Noch bequemer wird es, wenn Du die einfachen Datenbankfunktionen aus http://www.php.net/manual/de/ref.dba.php verwendest. Als Schlüssel eignet sich eine fortlaufende Nummer, die mit einem eigenen Schlüssel ("letzterEintrag") natürlich ebenfalls in der Datenbank gespeichert werden kann.