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
    - Antworten

    Die 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 Posts

    so 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 geklappt

    Etc.

    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 x

    Name:_____
    Antwort:_______
    [Senden] //In die Antwort-DB mit der Thema_ID x speichern

    Sind 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.


Log in to reply