Tutorials Infos - Anleitungen - Hilfe - Dreamcodes
 

Coden eines Forums

Die Grundstruktur eines Forums mit PHP.

Grundlagen
Das Forum kann als eine Art erweitertes Gästebuch angesehen werden. Einträge können sich dort auch auf bereits vorhandene beziehen und werden diesen dann in einer Baumstruktur (vergleichbar mit dem Dateisystem) untergeordnet. Jeder Eintrag besteht grundsätzlich aus fünf Feldern: Autor, E-Mail, Zeit, Thema und Text. Zur Verwaltung und Strukturierung der Einträge werden zwei weitere Felder benötigt: ID und parent_ID. Das Feld parent_ID bildet die Verknüpfung zu anderen Einträgen. Es enthält 0, wenn der Eintrag in der untersten Ebene gepostet wurde (als neues Thema / neuer Thread) bzw. die ID des Eintrags, auf den geantwortet wurde und dem der neue Eintrag untergeordnet wird.
Aus Gründen der Darstellbarkeit sollte die maximale Anzahl von Ebenen beschränkt werden (z.B. auf 10).

Folgende Seiten werden für ein funktionstüchtiges Forum benötigt: Eine Seite, in welcher die Einträge samt Baumstruktur angezeigt werden ("default.php"), eine Seite für neue Einträge ("entry.php") und eine Seite um neue Einträge zu speichern ("entry_save.php").

Darstellung der Baumstruktur
Da jeder Eintrag im Prinzip beliebig viele Untereinträge haben kann, muss man eine flexible Programmierung anwenden um alle Einträge und ihre Beziehung zueinander darzustellen. Dazu soll eine Funktion show_subentries() geschrieben werden, die als Argument die ID des Eintrags annehmen soll, dessen Untereinträge als Liste angezeigt werden.
Für jeden ausgegebenen Eintrag wird die Funktion dann wieder aufgerufen, um auch dessen Untereinträge zu zeigen. Dieses Programmierkonzept wird als "rekursive Funktionsaufrufe" bezeichnet und kommt v.a. bei Daten in Baumstruktur zur Anwendung.
Gestartet wird der gesamte Prozess durch einmaliges Aufrufen der Funktion mit dem Argument 0, also den Einträgen der untersten Ebene.

In show_subentries() wir zuerst überprüft, ob es Einträge mit der angegebenen parent_ID gibt. Sind solche vorhanden, wird eine einfache Tabelle mit zwei Spalten ausgegeben, deren erste Spalte nur als Einrückung dient, um die Baumstruktur darzustellen.


Code:

$link = mysql_connect("my.sqlserver.com", "user", "passwd");
mysql_select_db("database", $link);

function show_subentries($parent_ID) {
global $link;

$sql = "SELECT * FROM forum WHERE parent_ID = $parent_ID ORDER BY Zeit DESC";
$result = mysql_query($sql, $link);
if ($result != false) {
$n = mysql_affected_rows($link);
for ($i=0; $i<$n; $i++) {
?>

print mysql_result($result, $i, "Subject")."
";

// Funktion rekursiv aufrufen um Untereinträge zu zeigen
show_subentries(mysql_result($result, $i, "ID"));

?>
}
}
}

// für Einträge unterster Ebene aufrufen
show_subentries(0);

mysql_close($link);
?>



Das obige Beispiel zeigt von den Einträgen zwar nur das Subject, es kann aber leicht um Autor und EMail ergänzt werden. Dann sollte ein Link von jedem Eintrag wieder auf "default.php" zeigen, dem die ID des Eintrages übergeben wird. Der gewählte Eintrag wird dann angezeigt und in der Baumstruktur eventuell hervorgehoben.

Einträge speichern
Die Seite mit dem Eintragsformular übergibt die Daten an das Skript "entry_save.php", wo diese in die Datenbank eingetragen werden. Um dem Benutzer eine Seite wie "Ihr Eintrag wurde gespeichert." zu ersparen, soll danach direkt zum Forum weitergeleitet werden. Dies geschieht aber nicht mit HTML-Methoden (wie JavaScript oder einem Meta-Tag; diese Methoden funktionieren zudem nicht überall) sondern indem der HTTP-Header mit PHP manipuliert und direkt über den Header auf eine andere Seite umgeleitet wird.

Wichtig beim Speichern des Eintrags ist jedoch, dass der Wert für das parent_ID Feld mitgeliefert wird. Dies kann entweder über GET im Skriptaufruf von "entry_save.php" geschehen oder über ein verstecktes ("hidden") Input-Feld.

Da es auch in SQL Zeichen mit besonderer Bedeutung gibt (wie z.B. ' oder " um einen String in der SQL-Query zu markieren), müssen diese wie in PHP entsprechend ersetzt werden. Dies übernimmt die Funktion addslashes(). Beim Anzeigen der Daten werden die "\" von der addslashes() Funktion dagegen automatisch entfernt (manuell wäre dies mit stripslashes() möglich). Es sollten jedoch anschließend (wie beim Gästebuch) die Sonderzeichen von HTML codiert werden.

Code:

$link = mysql_connect("my.sqlserver.com", "user", "passwd");
mysql_select_db("database", $link);

$Zeit = date("Y-m-d H:i:s");

$Autor = addslashes($Autor);
$EMail = addslashes($EMail);
$Subject = addslashes($Subject);
$Text = addslashes($Text);

$return = mysql_query("INSERT INTO forum (parent_ID, Autor, EMail, Subject, Text, Zeit) VALUES ($parent_ID, '$Autor', '$EMail', '$Subject', '$Text', '$Zeit')", $link);

if ($return != false) {
// zurück zum Forum
header("Location: default.php");
} else {
print "Fehler beim Speichern.
";
print mysql_error();
}

mysql_close($link);
?>



Weitere Features des Forums
Mit dem bisher vorgestellten Funktionsumfang wird das Forum zwar im Grunde funktionieren, es lässt aber auch mit einem schönen Layout viele Funktionen, die andere Forensysteme bereitstellen, vermissen.

Sehr praktisch ist zum Beispiel ein Administrationsmodus, in den man über eine Passworteingabe wechselt und der mit HTTP-Authentifizierung implementiert werden kann. Der Administrator kann dann Einträge bearbeiten oder löschen, ohne dass er direkten Zugang zur Datenbank hat. Beim Löschen von Einträgen ist zu beachten, dass auch alle Untereinträge (rekursiv) entfernt werden müssen.
Baut man eine Registrierung der Forumsbenutzer ein, könnten auch User ihre Einträge nachträglich noch bearbeiten.

Mit einem Cookie oder mit registrierten Benutzern kann man die Felder Name und EMail bei der Erstellung eines Eintrags auch schon von vornherein ausfüllen, da diese meist dieselben bleiben werden.

Damit man schnell erkennt, welche Einträge neu im Forum sind, kann man sich am einfachsten die Fähigkeit von Browsern zunutze machen, bereits besuchte Links farblich hervorzuheben. Trotzdem ist eine separate Seite mit den 10 (oder 20 etc.) aktuellsten Einträgen (nicht als Baum, sondern als Liste) recht praktisch.

Bei einem ausgewählten Eintrag ist es recht leicht ein kleines Navigationsmenü einzublenden, also z.B. Buttons für "eine Ebene hinauf" und "zur untersten Ebene". Zudem kann man die Zahl der Untereinträge ermitteln und bei jedem Eintrag anzeigen.

Mit einer Datenbank eigentlich nicht schwer zu realisieren ist eine Suche in allen Forumseinträgen. Die SQL-Query muss dazu etwa "SELECT * FROM forum WHERE Text LIKE '%$Suchbegriff%'" lauten. Die Kopfzeilen der gefundenen Einträge können dann als einfache Liste angezeigt werden.

Oft zu sehen ist auch eine Option "E-Mail-Benachrichtigung bei Antworten", die man beim Erstellen eines Eintrags wählen kann. Der Server schickt dann dem Verfasser eines Beitrags ein EMail, wenn jemand auf dessen Eintrag reagiert, vorausgesetzt, eine E-Mail-Adresse wurde angegeben.

 
ID: 117
eingestellt am: 19.03.2003
Autor: ferryx
Status zum lesen: Gast
gelesen: 9949
Webseite: www.dreamcodes.com
[Drucken]