Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Kommentar auf Beiträge in eigenem Forum / Realisierung mit PHP+MySQL

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Kommentar auf Beiträge in eigenem Forum / Realisierung mit PHP+MySQL

    Hallo PHP-Gemeinde,

    leider drehe ich mich schon seit ein paar Tagen im Kreis. Ich möchte ein kleines Forum erstellen. Dem Forum-Kommentator (Admin) soll es möglich sein Beiträge zu "löschen" (realisiert) und zu kommentieren. Die Tabelle der Beiträge. bzw. Einträge der User ist wie folgt aufgebaut:

    Tabelle forum

    Code:
    id_content (INT - Primary - Autoincrement)
    user (varchar)
    ueberschrift (text)
    beitrag (text)
    datum (timestamp)
    visible(int)
    Spalte datum befülle ich mit CURRENT_TIMESTAMP. Die Ausgabe der Beiträge sortiere ich nach der Spalte datum.

    Nun sollte der Kommentar des Admins direkt nach dem entsprechenden Beitrag eingefügt werden.

    Ich habe folgendes versucht:

    1. Idee - Erhöhen der id, sodass der zu kommentierende Beitrag seine id behält, der Admin-Kommentar die nächst höhere (+1) und alle anderen von der ausgewählten id um +2 erhöht werden. Zu Recht bekomme ich die Meldung - Duplicate entry '(entsprechende id)' for key 'PRIMARY'.

    Dies mache ich mit folgendem Code:

    $id_comment liefert die id des zu kommentierenden Beitrags:

    PHP-Code:
    $update_sql "UPDATE forum SET id_content = id_content+2 WHERE id_content > $id_comment";

    $insert_sql    "INSERT INTO forum SET 
    id = '
    $id_comment'
    user     = '
    $user',
    beitrag    = '
    $text',
    ueberschrift     = '
    $ueberschrift',
    datum     = CURRENT_TIMESTAMP,
    visible = 1"

    2. Idee - Ich gebe den Kommentaren das Datum des Betrags mit und erhöhe diese um 1 Millisekunde. Hier sähe es ja dann aber so aus, also ob der Admin eine Millisekunde später reagiert hat.

    Hat jemand von Euch einen besseren Ansatz? Ich bin für jeden Kommentar dankbar.

    Vielen Dank schon mal.

  • #2
    Sorg für eine ordentliche Datenstruktur.
    Stichwort: Normalisierung

    Du erstellst eine Tabelle Kommentare. Als Fremdschlüssel übergibst du ihr die ID vom Beitrag der kommentiert wird.
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Zitat von groovemachine Beitrag anzeigen

      Tabelle forum

      Code:
      id_content (INT - Primary - Autoincrement)
      user (varchar)
      Normalisiere. User sollte hier wohl besser ein Fremdschlüssel sein.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Danke für die Tipps.

        Zwischenzeitlich habe ich folgende Lösung entwickelt:

        Ich habe eine zusätzliche Spalte, die ich mit den bearbeiteten Beiträgen (id_content) befülle und dann entsprechend "trimme", sodass später die Beiträge nach dieser Spalte sortiert und ausgegeben werden können.

        Vielen Dank an alle!

        Kommentar


        • #5
          Nun sollte der Kommentar des Admins direkt nach dem entsprechenden Beitrag eingefügt werden.
          Löse dich von der Vorstellung, das "gleich hintereinander" gleichzusetzen ist mit "direkt aufeinanderfolgender ID" - das ist Quatsch!

          Solange du über ein gemeinsames Kriterium (z.B. gemeinsamer Fremdschlüssel) zwei oder mehr Dinge einander zuordnen kannst, kann eine Reihenfolge auch mit den Zahlen 1 und 99 hergestellt werden... oder 6 und 8, oder a und f
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Hallo lstegelitz,

            darf ich Dich hier um ein Beispiel bitten, eventuell mit Link?

            Danke.

            Kommentar


            • #7
              Ein Beispiel:

              Angenommen du hast 2 Tabellen für topic und posts, wobei ein topic n posts besitzen kann. Vereinfacht sehen die Tabellen so aus

              topic (id, text)
              posts (id, topic_id, text)

              Code:
              id | topic_id | text
              1  | 1        | Bla bla vom User
              2  | 2        | Bla bla vom User
              3  | 2        | Bla bla vom Admin
              4  | 1        | Bla bla vom Admin
              posts mit gleiche topic_id gehören zusammen, ganz egal welche id sie haben. Selektiere also alle posts mit der topic_id 1 und du erhälst:
              Code:
              id | topic_id | text
              1  | 1        | Bla bla vom User
              4  | 1        | Bla bla vom Admin
              Die id der posts-Einträge müssen also nicht direkt hintereinander liegen, es reicht wenn dazwischen nichts anderes erscheint.
              Solange du also nicht bei den posts mit id 2 oder 3 die topic_id auf 1 änderst, folgt der Admin-post unmittelbar auf den User-post.

              Klar soweit?

              Da man nun aber nicht nach ID's sortieren sollte, benutzt man ein zusätzliches Feld für die Sortierreihenfolge.
              Denn ein Problem ergibt sich wenn man einen Datensatz zwischen 1 und 4 einfügen will (und, wie im Beispiel, die ids 2 und 3 bereits vergeben sind).

              Erweitere die Tabellendefinition um eine sort_order
              posts (id, topic_id, sort_order, text )
              Code:
              id | topic_id | sort_order | text
              1  | 1        | 10         | Bla bla vom User
              2  | 2        | 10         | Bla bla vom User
              3  | 2        | 20         | Bla bla vom Admin
              4  | 1        | 20         | Bla bla vom Admin
              topic 1 order by sort_order ASC
              Code:
              id | topic_id | sort_order | text
              1  | 1        | 10         | Bla bla vom User
              4  | 1        | 20         | Bla bla vom Admin
              Um nun einen Post zwischen den User und den Admin Post zu schieben, lege einen neuen Datensatz zu topic 1 an und gib ihm einen sort_order zwischen den beiden vorhandenen:
              Code:
              id | topic_id | sort_order | text
              10 | 1        | 15         | Bla bla vom Superadmin
              Ruft man das ganz wieder ab, erscheinen die Datensätze in dieser Reihenfolge:
              Code:
              id | topic_id | sort_order | text
              1  | 1        | 10         | Bla bla vom User
              10 | 1        | 15         | Bla bla vom Superadmin
              4  | 1        | 20         | Bla bla vom Admin
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Lieber lstegelitz - Herzlichen Dank!!!! Mehr kann ich nicht sagen! Das war mehr als einleuchtend. Chapeaux!

                Kommentar

                Lädt...
                X