Wie schreibt man ein Forum mit PHP und Mysql

Wie erstellt man ein kleines Forum mit PHP und MYSQL? Dieses Tutorials zeigt wie es geht


Forum Tutorial

Also ich dachte viele Leute hätten gern ein eigenes Forum auf ihrer Seite. Doch wenn man ein fertiges Form nimmt, hat man öfters mal ein Design Problem, weil das Forum einfach nicht zu der Seite passt. Oftmals will man aber einfach auch eine kleine Plauderecke für seine Gäste machen. Ich versuche jetzt mal das Scripten eines kleinen Forums zu erläutern.

Als Grundvoraussetzung verlange ich, dass Sie wissen, wie man MySQL-Tabellen erstellt und aus ihnen per PHP ausliest, bzw. ändert. HTML Kenntnisse wären auch nicht ohne, denn Sie müssen Formulare erstellen.

Also: Das Herzstück des Forums sind die MySQL Tabellen.

Hier die erste: Machen Sie eine Tabelle namens "foren". In ihr sollen die einzelnen verfügbaren Foren aufgelistet sein.
Die Tabelle muss folgendermaßen aussehen:

+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  |      | PRI | NULL    | auto_increment |
| name  | tinytext |      |     |         |                |
+-------+----------+------+-----+---------+----------------+

Die id wird bei jedem Datensatz automatisch gesetzt und das Feld "name" beschreibt einfach den Namen des Forums. Die id benötigen wir später um auf die Einzelnen Beiträge und Threads zuzugreifen. 

Die 2. Tabelle nennen Sie "threads" und erstellen sie nach folgendem Aufbau:

+---------+---------------+------+-----+---------+----------------+
| Field   | Type          | Null | Key | Default | Extra          |
+---------+---------------+------+-----+---------+----------------+
| id      | int(11)       |      | PRI | NULL    | auto_increment |
| fid     | int(11)       |      |     | 0       |                |
| topic   | tinytext      |      |     |         |                |
| created | timestamp(14) |      |     |         |                |
+---------+---------------+------+-----+---------+----------------+

Das Feld id wird wieder automatisch gesetzt und wird benötigt, um auf die Beiträge zuzugreifen, die in diesem Thread geschrieben sind. Das Feld "topic" beinhaltet den Namen des ersten Beitrags, der erstellt wurde und somit auch das Topic oder den Betreff des Threads.

Das Feld "created" beinhaltet nichts anderes als den Timestamp des Threads, anders gesagt, wann er erstellt wurde.

Nun zu der 3. und letzten Tabelle:
Nennen Sie die Tabelle "answers" und bauen Sie sie nach folgendem Schema auf:

+---------+---------------+------+-----+---------+----------------+
| Field   | Type          | Null | Key | Default | Extra          |
+---------+---------------+------+-----+---------+----------------+
| id      | int(11)       |      | PRI | NULL    | auto_increment |
| tid     | int(11)       |      |     | 0       |                |
| fid     | int(11)       |      |     | 0       |                |
| user    | tinytext      |      |     |         |                |
| topic   | tinytext      |      |     |         |                |
| text    | text          |      |     |         |                |
| created | timestamp(14) |      |     |         |                |
+---------+---------------+------+-----+---------+----------------+

Das id Feld wird wie immer zur eindeutigen Identifizierung genutzt. "tid" beinhaltet die ID des Threads, indem der Beitrag verfasst wurde und "fid" analog dazu das Forum.

Das "user"-Feld beinhaltet später den Namen des Autors. Die Autoren sollen ja auch in der Lage sein, ihren Beiträgen eine Überschrift zu geben, daher benötigen wir noch ein Feld "topic". "text" beinhaltet, wie es der Name eigentlich schon sagt, den eigentlichen Text des Beitrags. "created" benutzen wir wie vorher wieder um das Erstellungsdatum festzuhalten.

Soviel zum groben Aufbau des Forums.

Nun wollen wir eine Übersichtsseite erstellen, auf der der Besucher alle Foren sehen und selektieren kann.Ich bringe jetzt nur mal ein sehr einfaches Beispiel, wie es aussehen könnte. Natürlich können Sie ihre Beiträge schön in einer Tabelle anordnen und sie somit an das Design ihrer Seite anpassen.Also geben Sie die Forumnamen mit einem Hyperlink aus. Im Hyperlink müssen Sie auf die Seite verweisen, in der dann später die einzelnen Threads angezeigt werden, gefolgt von der ID des Forums, das angezeigt werden soll.Um Ihnen das Getümmel der Dateien ein wenig zu erleichtern, benennen wir sie einfach.Die Datei zum Anzeigen der Foren nennen wir showforen.php, die Datei zum Anzeigen der Threads nennen wir showthreads.php. Weitere werden folgen :)!

<?php
/* showforen.php */
//Herstellen der MySQL verbindung
$con mysql_connect($host$user$pass);
$db mysql_select_db($database);

//Herauslesen der Foren
$res mysql_query("select * from foren");

//Ausgeben der Foren mit Hyperlink
while($row mysql_fetch_array($res)) {
    echo 
"<a href="showthreads.php?fid=".$row["id"]."">";
    echo 
$row["name"]."</a><br>";
}
?>

So schon geschafft...die Foren werden angezeigt?

Nun folgt fast immer das selbe Spiel bis zu den Beiträgen.
Wir nehmen jetzt noch eine weitere Datei in unser Vokabular auf, nämlich die showanswers.php.

Als nächster Schritt müssen wir die Threads auflisten. Das geschieht fast genau so, wie in der showforen.php, außer dass wir ja eine Variable "fid" mitgeliefert bekommen, die es noch zu verwerten gilt. Wir möchten also nun alle Threads anzeigen, die in dem Feld fid unserer Datenbank den Wert enthält, der uns der Besucher mitgeteilt hat. Das geschieht auf folgende Weise:

<?php
/* showthreads.php */
//Herstellen der MySQL verbindung
$con mysql_connect($host$user$pass);
$db mysql_select_db($database);

//Herauslesen der Threads, die in dem Forum stehen
$res mysql_query("select * from threads where fid=".$_GET["fid"]);

//Ausgeben der Threads mit Hyperlink auf showanswers.php
//Die jetzige Ausgabe der Tabelle "threads" liefert jetzt
//eine neue Variable mit, die wir auch in den Link
//setzen müssen
while($row mysql_fetch_array($res)) {
    echo 
"<a href="showanswers.php?fid=".$row["fid"]."&tid=".$row["id"]."">";
    echo 
$row["topic"]."</a><br>";
}
?>

Nun verweisen wir auf die Datei showanswers.php und liefern ihr die ID des Forums und die ID des ausgewählten Threads mit.Anhand dieser Variablen können wir nun zum letzten Schritt der Anzeige übergehen, das Anzeigen der Beiträge.

<?php
/* showanswers.php */
//Herstellen der MySQL verbindung
$con mysql_connect($host$user$pass);
$db mysql_select_db($database);

//Lesen aus DB
$res mysql_query("select * from answers where fid=".$_GET["fid"]." AND tid=".$_GET["tid"]);

//ausgeben
while($row mysql_fetch_array($res)) {
$text nl2br($row["text"]; //Zeilenumbrüche nicht vergessen ;)
echo "<p>";
echo 
"Titel des Beitrags: ".$row["topic"]."<br>";
echo 
"Name des Autors: ".$row["user"]."<br>";
echo 
"Nachricht: ".$text."<br>";
echo 
"</p>";
?>

Wenn Sie wollen, können Sie auch noch das Erstellungsdatum anzeigen, das wir später im Format JJJJMMTTSSmmss speichern werden. Sie können aus dem kompletten Datumsstring noch einen Formatierten String im deutschen Format machen TT.MM.JJJJ SS:mm:ss

Dies erreichen Sie mit der Funktion substr(). 

Da dies nicht der eigentliche Bestandteil des Tutorials ist, setzte ich nur mal kurz die Erklärung der Funktion von PHP hier rein:

string substr ( string string, int start [, int length])

substr() gibt den Teil von string zurück, der durch die Parameter start und length definiert wurde. Wenn start positiv ist, beginnt der zurück gegebene String an der start-Position von string, angefangen bei NULL. So ist z.B. im String 'abcdef' das Zeichen an der Position 0 gleich 'a', das Zeichen an der Position 2 ist 'c' usw.

So die Ausgabe haben Sie hinter sich?Doch eins fehlt noch?ihre Besucher wollen ja auch selber posten.

Setzen Sie dazu in der showthreads.php einen Link auf die Datei newthread.php und übergeben Sie ihr wie vorher die ID des Forums, indem ein neuer Thread erstellt werden soll. Die Datei newthread.php braucht ein Formular, dass ein Feld für den Namen, für die Überschrift (Topic) und ein großes Textfeld für die Nachricht.

Die Felder benennen wir ganz simpel mit "name", "topic" und "nachricht". Das Formular muss mit der Methode "POST" an die Datei newthread_script.php verschickt werden. Was Sie beachten müssen ist, dass Sie in dem Formular ein hidden-Field integrieren, das die ID des Forums zwischenspeichert. Nennen Sie es einfach wieder "fid". 

So nun wollen wir und mal an den Code für das Eintragen machen?

<?php
/* newthread_script.php */
//Herstellen der MySQL verbindung
$con mysql_connect($host$user$pass);
$db mysql_select_db($database);

//Variablen auf andere Deklarieren (ist einfacher zu schreiben)
$nachricht $_POST["nachricht"];
$topic $_POST["topic"];
$name $_POST["name"];
$fid $_POST["fid"];

//schreiben in DB (nur Thread an sich)
mysql_query("insert into threads set fid='$fid', topic='$topic', created=now()");

//nun brauchen wir noch die neue ID des Threads, um sie in answers
// einzutragen
$res mysql_query("select max(id) AS max from threads");
$row mysql_fetch_array($res);
$thread_id $row["max"];

//so nun schreiben wir den eigentlichen Beitrag in die DB
mysql_query("insert into answers set text='$text', topic='$topic', user='$name', fid='$fid', tid='$thread_id', created=now()");

//Weiterleitung zu der Auflistung der Threads im
//bereits ausgewählten Forum
header("Location: showthreads.php?fid=".$fid);
?>

So das wars?wir haben einen Thread inkl. einem neuen Eintrag erstellt?
Wir nähern uns dem Ende des Tutorials

Jetzt werde ich noch erläutern, wie man eine Antwort auf einen Beitrag erstellt. Setzen Sie einen Link auf die Seite, wo die Beiträge angezeigt werden, also showanswers.php. Der Link muss dieses Mal nicht nur die fid, sondern auch die tid enthalten, da Sie ja gezielt in einem bestimmten Thread eine Antwort erstellen wollen Die Seite zum antworten nennen wir newanswer.php

Der Link muss dann ungefähr so aussehen:

<a href="newanswer.php?fid=123&tid=456">neuer Beitrag</a>

Nun kommt wieder die selbe Prozedur wie vorher?es wird wohl am einfachsten sein, sie nehmen sich die newthread.php zur Hand und speichern sie unter dem Namen newanswer.php. Ändern sie die Empfängerdatei des Formulars von newthread_script.php zu newanswer_script.php und erstellen Sie noch ein zusätzliches hidden-Field mit dem Namen "tid". In diesem Feld müssen Sie als Value die ID des Threads eintragen, die Sie von der vorherigen Seite mitgeteilt bekommen haben.

Sie haben also statt einem Hidden-Field nun zwei, die so aussehen:

<input type="hidden" name="fid" value="<?php echo $_GET["fid"]; ?>">
<input type="hidden" name="tid" value="<?php echo $_GET["tid"]; ?>">

Nun nehmen Sie die newthread_script.php Datei zur Hand und speichern sie erneut unter dem Namen newanswer_script.php und ändern sie folgendermaßen ab:

<?php
/* newanswer_script.php */
//Herstellen der MySQL verbindung
$con mysql_connect($host$user$pass);
$db mysql_select_db($database);

//Variablen auf andere Deklarieren (ist einfacher zu schreiben)
$nachricht $_POST["nachricht"];
$topic $_POST["topic"];
$name $_POST["name"];
$fid $_POST["fid"];
$tid $_POST["tid"];

//einen neuen Thread schreiben müssen wir nicht mehr, denn
//er besteht ja schon ;)
//Die ID des Threads müssen wir auch nicht mehr provisorisch
//holen, da sie uns komfortabel vom Formular geliefert wird
//so nun schreiben wir den eigentlichen Beitrag in die DB
mysql_query("insert into answers set text='$text', topic='$topic', user='$name', fid='$fid', tid='$tid', created=now()");

//Weiterleitung zu der Auflistung der Antworten im
//bereits ausgewählten Forum und Thread
header("Location: showanswers.php?fid=".$fid."&tid=".$tid);
?>

So Sie haben es geschafft?Sie haben ihr eigenes Forum programmiert, vorausgesetzt, Sie haben es auch gemacht. Also somit sind wir am Ende?ich hoffe es hat ihnen weitergeholfen und mir sind nicht zu viele Fehler unterlaufen. 

Falls Sie einen Fehler finden, denken Sie dran, er war beabsichtigt!

sollten Sie noch ein wenig Hilfe benötigen, erreichen Sie mich im Forum unter Moqui

Erfahrungen

Durchschnittliche Bewertung:

5 Sterne
1
4 Sterne
1
3 Sterne
0
2 Sterne
0
1 Stern
0
Insgesamt 2 Bewertungen


Wolfgang Müller
Leider funzt das bei mir nicht. Ich habe es zum testen Mal in xampp gemacht.
Geschrieben von Wolfgang Müller Am 21.01.2024 22:19:31

Goldtable
Echt guter Artikel!
Danke auch für den Artikel mit dem ich HTML gelernt hab.
Einstieg in die Entwicklung mit HTML
https://meg-chat.de/tutorials/tutorial/html_grundlagen
Geschrieben von Goldtable Am 02.08.2023 00:53:12

wo ist die maske?
Geschrieben von niroj93 Am 15.09.2009 10:56:17

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe

Verwandte Beiträge

Eines Warenkorbsystem für Anfänger

Ein kurzes Tutorial für Anfänger um ein einfaches aber funktionelles Warenkorbsystem zu erstellen. Freue mich über Rückmeldungen und Kritik - denn nur so verbessert man sich :) ...

web3hoster

Autor : web3hoster
Kategorie: PHP-Tutorials

ASCII Datenbanken

ASCII Datenbanken sind eigentlich nur Textdateien, in denen man Daten speichert, die durch ein Trennzeichen voneinander getrennt sind. Dieses Tutorial zeigt wie es geht. Mit Übung und Lösung ...

deep_space_nine@

Autor : deep_space_nine@
Kategorie: PHP-Tutorials

IP-Sperre

IP-Sperre mit PHP und MySQL Oder wie man einen User für eine gewisse Zeit aussperrt. ...

webmaster1@

Autor : webmaster1@
Kategorie: PHP-Tutorials

Was muss ich in WordPress einstellen, damit Google Fonts nicht mehr geladen werden?

Möchten Du WordPress davon abhalten, Google Fonts zu verwenden? Hier erfährst Du, was du dafür in WordPress einstellen musst. ...

admin

Autor : admin
Kategorie: Sonstige Tutorials

Text-Counter mit IP-Sperre ( Cookies oder Datei)

In diesem Tutorial möchte ich erklären wir man auf 2 arten einen Counter Programmieren kann,nebenbei werden ein paar Datei Funktionen erklärt! ...

support1@

Autor : support1@
Kategorie: PHP-Tutorials

abhängige Listen

In einem Formular sollen neben mehreren anderen Eingabefeldern auch zwei Listen (Select-Felder) zum Einsatz kommen. Dabei soll der Inhalt der zweiten Liste vom gewählten Wert der ersten Liste abhängig verändert werden. ...

Patrick_PQ

Autor : Patrick_PQ
Kategorie: mySQL-Tutorials

Was muss ich in WordPress einstellen, damit Google Fonts nicht mehr geladen werden?

Möchten Du WordPress davon abhalten, Google Fonts zu verwenden? Hier erfährst Du, was du dafür in WordPress einstellen musst. ...

admin

Autor : admin
Kategorie: Sonstige Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen