Beste PHP/MSYQL Struktur für ein Forum

bambusa

Moderator
Hallo PCM 😉

Ich bin gerade dabei mit PHP und MYSQL ein Forum zu coden (nicht als Konkurrenz, einfach um es zu machen 😉)
Bisher habe ich das ganze in "klein" recht weit realisieren können.
Bevor ich das jetzt in "groß" anfange, stellt sich noch die Frage wie ich die Datenbank am besten verwalte.

Meine aktuelle Idee:
Für jeden Thread eine eigene Tabelle in der Datenbank anlegen, um die Antworten und das löschen und editieren des Threads am einfachsten zu verwalten.
Die Unterforen, also die Übersicht über die Threads wo nur Name und Betreff angezeigt wird, würden jetzt eine eigene Tabelle erhalten, beim eröffnen eines neuen Threads würden also Name und Betreff etc. bis auf den Eintrag in zwei Tabellen geschrieben.

Ist nach der aktuellen Planung am einfachsten umzusetzen, scheint mir aber nich sehr effektiv. Das Problem ist eben das verwalten der Übersicht und der Antworten auf einen neuen Thread.

Wie würdet ihr das realisieren, habt ihr ne bessere Idee? 🙂
 
also ich hab das bei mir so gemacht

topics9fxc.jpg


postsohv0.jpg
 
Du könntest ein erstellen. Bei relativ komplexen Datenbeständen (du willst ja sicher auch User-Daten selbst und auch User-Gruppen verwalten können) kommts recht leicht zu Redundanz (allg. Thema "Datenbank-Normalisierung"). Da du jetzt etwas "größeres" machen willst, sollte man da schon etwas Planung rein stecken. Du musst dir ja nur mal die zig Tabellen von phpBB oder WBB anschaun.

So wie du es beschrieben hast, hast du ja zB in der Übersicht den Thread-Titel und in der Thread-Tabelle den Titel. Abgesehen davon, dass er doppelt gespeichert ist, musst du auch dafür sorgen, dass beide jeweils aktuell sind. Aber was machst du dann, wenn einer anders ist? Welcher ist der gültige? Aus dem Grund lässt man das besser gleich ganz weg... Eine Datenbank soll ja auch ohne deiner dazugehörigen Anwendung (also dein PHP-Skript) noch brauchbar sein.

Wenn du für jeden Thread eine eigene Tabelle erstellst, bekommst du am Ende ziemlich viele Tabellen (viele Threads haben auch nur einen Beitrag), obwohl man auch gut in einer Tabelle mehrere tausend Tupel (Zeilen) haben kann.
 
Danke erstmal.
Vielleicht sollte ich mir wirklich erstmal ein Diagramm anlegen...

User habe ich vorerst mal gar nicht, bisher kann da jeder reinschreiben, der Name wir jedesmal mit eingegeben.
Das wäre dann der nächste Schritt
 
Mal ne Frage btw
Gibts ne Möglichkeit mit PHP einen Datensatz (der vorher per Formular entstanden ist) erst dann in die Tabelle einzutragen, wenn man einen Knopf drückt oder so?
Um nämlcih nochmal zu checken was man geschrieben hat, bevor es eingetragen wird.

Hab das nach googeln mal so gemacht, klappt aber nicht...
print("<br><form method='post' action='Neueintrag.php'>
<input type='button' name='Eintragen' value='In Datenbank eintragen'>
</form>");
if ($_POST['Eintragen'])
{
$anfrage=("INSERT INTO Eintrag VALUES('$datum','$zeit','$Titel','$Kategorie','$Einleitung','$Eintrag')");
mysql_query($anfrage);
mysql_close($db);
}
 
Zuletzt bearbeitet:
PHP:
echo"<br><form method='post' action='#'>
//formular
<input type='submit' name='submit' value='Absenden'>

</form>";
if (isset($_POST['submit']))
{
$anfrage=("INSERT INTO Eintrag VALUES('$datum','$zeit','$Titel','$Kategorie','$Ei nleitung','$Eintrag')");
mysql_query($anfrage);
mysql_close($db);
}
 
Ich habe aus Spaß auchschon etwas Zeit in die Idee Investiert ein Forum zu coden, bisher schwebt mir eine DB etwa so vor:

Posts: #ID - einmalige Nummer des Posts (auto increment), Autor (die einmalige ID des Benutzeraccounts der den Post verfasst hat), Status (z.B. sichtbar/unsichtbar um Beiträge für user unsichtbar für Moderatoren aber sichtbar zu erhalten), Titel, Inhalt, Thread (einmalige ID des Threads zu dem er gehören soll, wenn ein User einen neuen Thread anlegt wird eine neue Zahl angelegt, wenn er lediglich antwortet wurde die ID ja zum anzeigen des Threads schonmal abgerufen und kann weiterverwendet werden).

Weitere Details wie Uhrzeit oder Datum dürftest du selbst hinbekommen.

Startposts eines Threads sind auch nur als Posts hinterlegt, aber haben von allen Posts mit der passenden Thread ID die niedrigste Post ID und darüber Hinaus noch den boolean-Wert start auf true sowie eine ID Nummer des Unterforums in dem sich der Thread befindet.

Unterforen haben halt eine ID, einen Namen, eine Beschreibung und ggf noch die ID eines übergeordneten Forums (bei Prozessoren stünde da beispielsweise Hardware drin).

Was in Benutzerprofile reinkommt und wie das am schlausten umgesetzt werden kann damit bin ich noch nicht so ganz fertig.
 
Sowas habe ich gesucht 🙂
Ist auf jeden Fall effizienter und ich habe keine 1000 Tabellen
Von Benutzern bin ich immernoch weit entfernt 😉
 
ich würde so was machen:

user
id | username | password | ... was man halt noch brauch

topic
id | description | type (enum -> mainTopic, subTopic) | subTopic was man auch no benötigt

thread
id | userId | topicId | createTimestamp | state (enum -> close, open,..) | description | evtl. noch mehr

message
id | userId | message | createTimestamp

Beschreibung:
id = immer autoincrement + PK
createTimestamp = integer, hier kannst du den unixtimestamp hinterlegen format: 1262649634
userId = FK auf Tabelle user
type, state = enums

Kurze Veranschaulichkeit:

topic
1 | Hardware Fragen | 'mainTopic' | 0
2 | Server Hardware | 'subTopic' | 1
3 | Blub Hardware | 'subTopic' | 1

d.h. ein subTopic muss immer ein MainTopic haben

thread
1 | 1 | 2 | 1262649634 | open | 'ich bin eine beschreibung' | 'ich bin der inhalt'
2 | 1 | 3 | 1262649634 | open | 'ich bin eine beschreibung' | 'ich bin der inhalt vom gleichen user'
3 | 2 | 2 | 1262649634 | open | 'ich bin eine beschreibung' | 'bin ein anderer user'

Jetzt noch Indexe auf die Ids setzen und schon sollte es klappen 😛

kann man sicherlich noch sehr viel besser aufgliedern.
mir kam jetzt nur sponatn diese idee 🙂
 
Was ist denn Message?

Was mir gerade noch zu meinem Entwurf einfällt, du solltest die neue ThreadID zu einem schlauen Zeitpunkt sichern, sonst hast du ab einer gewissen Forengröße und Nutzungauslastung das Phänomen dass >=2 User zur selben zeit einen Thread erstellen wollen und ggf. eine Thread ID mehrfach verwendet werden könnte, das wäre irgendwie doof beim Threadlesen 🙂
 
kurz beschrieben, hab ich es so gedacht:

MainTopic (Hardware) (ID 1)

  • SubTopic (Hardware Windows Pc) (ID 2) (SubtopicId 1)

  • SubTopic (Hardware Mac Pc) (ID 3) (SubtopicId 1)

also "SubtopicId" ist eigentlich eher die parentId, also auf das Topic, auf welches es sich bezieht, bzw. darüber liegt.

hoffe, nun ist es bissel klarer ausgedrückt 🙂


edit:
message ist der eigentliche forumseintrag, sollte man auch "forumEntry" nennen. ^^
 
Ah ich denke ich verstehe.
Aber das ist doch ein wenig umständlich oder nicht....?
Ist mir glaube ich etwas komplex, ich hab eher ein kleineres Projekt geplant
 
Das mit den Topics würd ich ein wenig anders aufbauen.
Statt dem Type würde ich den Parent speichern. Also die ID des übergeordneten Bereiches. Stellt man sie auf 0 wird er zu als Hauptbereich gesehen. Somit können die Bereiche unendlich viele Unterbereiche haben.

Bei den Thread Beispielen nennst du so Sachen wie "'ich bin der inhalt'".
Sollte das nicht bei den Messages Stehen?
Und irgendwie fehlt bei den Messages noch die Thread ID
 
Kann mir mal eben einer helfen....?
Ich hab die Tabellen Struktur recht ähnlich wie von olf vorgeschlagen.
Wie krieg ich jetzt die Startposts in der Übersicht hin, also das eben nur Der Datensatz mit der niedrigsten ID einer ThreadID angezeigt wird...? 😕

Bisher werden einfach alle Einträge der Datenbank nach ID geordnet angezeigt, wie bekomme ich die dementsprechend aussortiert...?
 
so ähnlich

$topicliste1 = mysql_query("SELECT * FROM Threads where ThreadID=irgendeineid");
$topiczeilen1 = mysql_fetch_array($topicliste1);

echo $topiczeilen1[name];
 
Zuletzt bearbeitet:
Und dann kommt so ne schöne ID namens
Code:
'; DROP TABLE topics; #

Ich würds erst noch mit mysql_real_escape_string() versuchen.
 
das designen der datenbank muss auf jeden Fall gut geplant werden.
Ich würde die von der Datenbank selbst unterstützen abhängigkeiten von feldern über mehrere tabellen nutzen. Das erspart dir arbeit und verhindert einige Fehler. so löscht die Datenbank automatisch alle Beiträge eines Threads wenn der Thread gelöscht wird. Das ist sehr praktisch. Ich weiß nicht wie man sich mysql datenbanken durch ein uml generieren lassen kann, da gibt es aber bestimmt tools. für mssql ist das visual studio oder das sql management studio ziemlich gut. Dann würde ich dir noch empfehlen die vergabe von id's auch die datenbank machen zu lassen, da sonst gleichzeitige zugriffe zu doppelten id's führen würden. eine komplette struktur kann ich dir jetzt nicht nennen, da das für mich arbeit von mehreren Stunden wäre, aber du kannst dir strukturen von standardforen ansehen alà phpbb

edit: noch sehr wichtig! für alle merken!
EINE SQL ABFGRAGE WIRD NICHT ZUR LAUFZEIT ZUSAMMENGEFLICKT!!!
DAFÜR GIBT ES SQL PARAMETER

sry aber das musste gesagt werden
 
Zuletzt bearbeitet:
Kann mir mal eben einer helfen....?
Ich hab die Tabellen Struktur recht ähnlich wie von olf vorgeschlagen.
Wie krieg ich jetzt die Startposts in der Übersicht hin, also das eben nur Der Datensatz mit der niedrigsten ID einer ThreadID angezeigt wird...? 😕

Bisher werden einfach alle Einträge der Datenbank nach ID geordnet angezeigt, wie bekomme ich die dementsprechend aussortiert...?


Also davon ausgehend wie es in meinem Entwurf ist, etwa so:

Code:
Select * From Posts Where start = true
Oder du baust dir was unübersichtliches aus Schleifen 😉 etwa alle Posts holen und nach ThreadID sortieren und dann für jede ThreadID nochmal den mit der niedrigsten PostID holen...
 
Doof nur das ich genau die Spalte nicht habe^^
Werde ich aber denke ich noch ändern, scheint das simpelste zu sein 😉
 

Online-Statistiken

Zurzeit aktive Mitglieder
1
Zurzeit aktive Gäste
25
Besucher gesamt
26

Beliebte Forum-Themen

Zurück
Oben Unten