path_to_file = $path_to_file; } /** * Liest die Datenbank-Textdatei in das Attribut $entry_lines. * - überprüft, ob file resource vorhanden und setzt entweder den zeiger auf 0 oder öffnet neue * - liest aus der Datei das array aus und dreht es um (ACHTUNG: noch mit Zeilenenden) */ function read_file () { if ($this->file_resource) { fseek($this->file_resource, 0); } else { $this->file_resource = fopen($this->path_to_file, 'r'); if (!$this->file_resource) { $this->error = true; return false; } flock($this->file_resource, LOCK_EX); } $this->entry_lines = file($this->path_to_file); if ($this->entry_lines === false) { $this->error = true; return false; } $this->entry_lines = array_reverse($this->entry_lines); // remove lines with incorrect syntax or comments $count_entry_lines = count($this->entry_lines); // necessary because count is changed by unsetting entries for ($i = 0; $i < $count_entry_lines; $i++) { if (!preg_match('~^\d{10}\t.+?\t.+$~', $this->entry_lines[$i])) { unset($this->entry_lines[$i]); } } return true; } /** * Gibt den nächsten Eintrag zurück. * - gibt je Aufruf eine Zeile als Array zurück * - EOF gibt false zurück * - ähnlich wie mysql_fetch_row */ function get_next_entry ($date_format = 'j.n.y') { // eine Zeile $entry = current($this->entry_lines); next($this->entry_lines); // ende if ($entry === false) { return false; } $entry = trim($entry); $result = explode("\t", $entry); // date $result[0] = date($date_format, $result[0]); // body: maskierte new lines demaskieren und breaks anfügen $result[2] = preg_replace('~(\\\n)+~', "
\n", $result[2]); return $result; } /** * Speichert einen neuen Eintrag. * - öffnet Datei zum schreiben (anhängen) * - schreibt die Eingabe in die letzte Zeile * - gibt bei Erfolg true zurück */ function add_entry ($sender, $message) { if ($this->contains_spam_hints($sender . $message, array($sender))) { return false; } $this->file_resource = fopen($this->path_to_file, 'a+'); if (!$this->file_resource) { //$this->error = true; // Wird hier ein Fehler gesetzt, geht wird auch das Anzeigen der shoutbox unterbunden. return false; } flock($this->file_resource, LOCK_EX); $sender = substr($sender, 0, 25); // auf 25 Zeichen beschränken $sender = preg_replace(array("~\t~", '~<~', '~>~'), array(' ', '<', '>'), $sender); $message = substr($message, 0, 220); // auf 220 Zeichen beschränken // TODO Lange Wörter richtig umbrechen und zwar in der Ausgabe, nicht der Eingabe. // $message = wordwrap($message, 30, '-'); // nach 30 Zeichen mit '-' umbrechen $message = preg_replace(array("~\n~", "~\r~"), array('\n', ''), $message); // new line in \n maskieren $message = preg_replace(array("~\t~", '~<~', '~>~'), array(' ', '<', '>'), $message); $entry = "\n" . time() . "\t" . $sender . "\t" . $message; fwrite($this->file_resource, $entry); /* __mail__ */ $to = 'Martin Stadler '; $subject = utf8_decode('Neuer Eintrag in der Gruß-Box'); $body = 'Name:' . $sender . "\n" . 'Nachricht: ' . "\n" . preg_replace('~(\\\n)+~', "\n", $message); $body = utf8_decode(preg_replace('~\r~', '', $body)); // prepare_for_db $from = 'From: Beethoven2000 Gruß-Box '; mail($to, $subject, $body, $from); return true; } /** * Schließt die Datei. */ function __destruct () { fclose($this->file_resource); } } ?>