forum
-
Hallo, ich plane ein eigenes kleines FOrum zu schreiben.
Im Prinzip ist es ja wie ein Gästebuch, bloß das man halt auf jeden Beitrag antworten kann.
D.h. ich brauche zwei Datenbanktabellen:
- Fragen
- AntwortenDie Fragen speicher ich ganz normal hintereinander weg wie beim Gästebuch eben.
Nun bin ich mir nicht ganz sicher, wie ich das mit den Antworten regeln soll.
Woher weiß ich denn, welche Einträge ich welche Frage zuordnern soll?------------
//lade frage 52
//lade antworten: aber welche antworten gehören nun zur frage 52 ? Wie mach ich das ?
-
Du hast die Frage, respektive das Topic mit einer Nummer.
Jeder Post ist einem dieser Topics zugeordnet. Name des Topics ergibt sich aus dem Titel des ersten Postsso etwa:
topics (ID)
users (ID, Nick)
posts (ID, users.ID, topics.ID, Zeit, Titel, Inhalt)das wär das gröbste, was du brauchen wirst
-
Ok also ich werde wiefolgt vorgehen. So sieht z.B. das Formular zum Erstellen eines Topics aus:
Name: Peter Pan
Titel: Wie schreibe ich ein Forum?
Nachricht:____lalalalalala___
_____________________________
_____________________________
_____________________________
[Senden]Dann wird erstmal ein Thema in die Topic-DB angelegt
#ID________#Thema
1__________Wie schreibe ich ein Forum?
2__________Ist das mein zweites Thema?Und die einzelnen Postings/Antworten in die Antworten-DB:
#ID_________#Antwort_______________#Von__________#Thema ID
1__________lalalalalala ___________Peter Pan_________1
2__________Google doch!__________User xxx__________1
3__________xD hahahah____________Herr Lustig_______1
4__________Glückwunsch, _________Hannes____________2
hat geklapptEtc.
Die Anzeige bastel ich denn einfach so zusammen:
<h2> lade titel des themas mit der id x </h2>
//lade alle beiträge aus der Antwort-DB mit der Thema_ID xName:_____
Antwort:_______
[Senden] //In die Antwort-DB mit der Thema_ID x speichernSind meine Gedanken so richtig ?
-
Hallo,
ja, das ist genau das was zwutz beschrieben hat. Er hat lediglich den Nutzer noch ausgelagert (spielt aber auch nur dann eine Rolle wenn sich der Nutzer anmelden muss um dein Forum nutzen zu können. Für Gastbeiträge reicht deine Variante vollkommen aus)
VlG
-
Ok danke für eure Hilfe.
Bin auch schon angefangen und hab nun ein Problem.
Wenn ich ein Thema hinzufügen möchte:...datenkbankverbindung
...titel wird in die topic-db eingetragen
...der rest(nachricht, userinfos etc) in die anwserr-db
und genau hier, will ich die #ID von dem vorher eingetragenen titel haben aber wie komme ich daran?
-
Ah hab schon:
$sql = "SELECT * FROM XXXX ORDER BY ID DESC LIMIT 1"; $result = mysql_query($sql); while($row = mysql_fetch_object($result)) { $id = "$row->ID"; }
-
bah... vorsicht... mach ne Transaction draus.
Wenn noch jemand einen Eintrag macht, bevor du die ID geholt hast, hast du sonst ein Problem..
außerdem: dafür gibts die PHP-Funktion
mysql_insert_id()
.also in etwa so:
<?php mysql_query("START TRANSACTION"); mysql_query("INSERT INTO topic (Thema) VALUES ($titel)"); $id = mysql_insert_id(); mysql_query("INSERT INTO post (Antwort, Von, Thema) VALUES ($antwort, $von, $id)"); mysql_query("COMMIT"); ?>
und außerdem: wenn du den höchsten Wert haben willst, gibts die Aggregat-Funktion MAX() in SQL. Das geht deutlich schneller als die ganze Tabelle zu sortieren. "SELECT *" sollte sowieso unbedingt vermieden werden
-
Danke Zwuutz!
Aber was genau bedeutet:
mysql_query("START TRANSACTION");
...und
mysql_query("COMMIT");
-
Ok habs gegoogelt. Sorry für den unnötigen Post.
-
"SELECT *" sollte sowieso unbedingt vermieden werden
Auch wenn man alle Einträge ausgeben will? Was ist denn die Alternative?
-
schlandiner schrieb:
"SELECT *" sollte sowieso unbedingt vermieden werden
Auch wenn man alle Einträge ausgeben will? Was ist denn die Alternative?
explizit die Spalten angeben, die man haben will, notfalls eben alle.
bei "SELECT *" ist die Reihenfolge der Spalten nicht immer die, die man erwartet, was zumindest den numerischen Zugriff unmöglich macht. Selbst wenn es funktioniert kann es beim Wechsel auf eine andere Datenbank oder dem Rückspielen einer Sicherung plötzlich Probleme geben.
Außerdem funktioniert der Query immer. Ändert sich eine Spaltenbezeichnung kann man also nicht aufgrund der Rückgabe des SQL-Servers die Richtigkeit überprüfen.
Frägt man dann die nicht mehr existierende Spalte ab kann es zu sonderbaren Verhalten je nach Umgebung führen
-
Ok danke werde ich berücksichtigen.
Also select spalte1, spalte2, spalte3 From .... ?Nochmal eine Frage. Mein Script ist so aufgebaut:
// Lade und zeige mir alle Antworten
//Ganz unten folgt das Antwortformular
<form method="post" action="aktuelleseite.php">
.....
</form>if (isset($_POST['submit']))
{
//neue Antwort eintragen
}//HIER möchte ich jetzt, dass er diese Seite neu lädt, damit der neue Eintrag auch mit angezeigt wird also irgendwi ein Befehl: Seite neu laden.
Hab auch schon gegoogelt aber die header() Funktion kann ich hier leider ja nciht verwenden.
-
bau dein Skript so auf:
<?php if (isset($_POST['submit']) { // Antwort eintragen // neuladen per header-redirect } ?> <html> <head> <blablabla ... <!-- antworten anzeigen --> <form method="post" action="<?php echo $PHP_SELF;?>"> ... </form> <...>
also mach das am Anfang der Seite bereits. Solang du noch keine Ausgabe machst, klappt auch der header-Umbau.
Alternativ lagere das Eintragen in ein zusätzliches Skript aus, dass du mit der Form aufrufst und leite von dort aus wieder auf die normale Seite weiter. So macht es auch z.B. dieses Forum hier
-
kunoiwo schrieb:
Danke Zwuutz!
Aber was genau bedeutet:
mysql_query("START TRANSACTION");
...und
mysql_query("COMMIT");Interessanter für mich: Welchen vorteil habe ich denn genau davon. Im gegensatz ohne Transaction?
-
Sqwan schrieb:
Interessanter für mich: Welchen vorteil habe ich denn genau davon. Im gegensatz ohne Transaction?
Transakionen werden vom Datenbanksystem als Atomar angesehen. Typisches Problem: B liest einen Wert, A liest denselben Wert, B schreibt diesen Wert, A schreibt diesen Wert. Das was B geschrieben hat ist somit verloren gegangen. Wenn A und B Transaktionen sind, werden diese nacheinander ausgeführt. B liest, B schreibt, A liest, A schreibt.