Frage zu Beiträgeverwaltung

  • Hey,


    ich möchte, dass ein user auch beiträge schreiben kann welche dann in die db gespeichert werden und dann sofort wieder ausgegeben werden, dazu möchte ich, dass der Username des Beitragerstellers oberhalb des beitrags steht, dass man erkennt wer den Beitrag geschrieben hat. Dies werde ich alles dämnächst versuchen umzusetzen. Nur die Frage die ich mir stelle ist, wie soll ich dies in der Datenbank ordnen ? Also mit Tabellen. Welche SQL-Befehle brauche ich für dieses Vorhaben ? Wie würdet ihr Vorgehen?


    Ich dachte, dass ich für die beiträge eine extra Tabelle mit den Spalten:

    - id (für Usererkennung)

    - username (user)

    - beitraege (die ganzen beiträge)

    - time (Uhrzeit des Posts)


    Der Home.php gebe ich aber keine id als parameter mit weil es sonst so viele Home-Seiten gibt wie User. Die Home-Seite soll es nur einmal geben wo alle posten können.

    Wie kann ich dann herausfinden welcher User genau gepostet hat ?


    Stef

  • Hi Stef


    Ich würde das Ganze mit 2 Tabellen machen.

    Eine Tabelle für die Beiträge und die andere mit den Usern. Ich weiss nun nicht wie komplex das werden soll.

    In der Tabelle mit den Beiträgen hast du einfach die ID des Users mit der du dann in der User Tabelle abfragen kannst welcher User diesen Beitrag erfasst hat.


    Hoffe konnte dir helfen.

  • Hey,


    Danke für die schnelle Antwort.


    Ja ich habe 1ne Registration Tabelle. In der ist alles was bei der registrierung abgespeichert wird. Dann würde ich dazu wie gesagt noch eine für Beiträge erstellen. Komplex noch nicht. Einfach die Beiträge mit den ids des users welcher den erstellt hat in die DB abspeichern. Und dann wieder mit dem Namen des Posts ausgeben. Vorerst.


    Und wie bekomme ich dann auf der home.php die id des Users raus ?


    Denn es sollen alle user nur auf dieser home.php beiträge erstellen können. Wo jeder sehen kann.

  • Zitat


    Und wie bekomme ich dann auf der home.php die id des Users raus ?


    Kann mir jemand dazu Ratschläge geben bitte? Ich habe schon gegoogelt und es versucht. Aber nix richtiges gefunden.

  • Ich verstehe die Frage nicht ?(

    Zitat


    Und wie bekomme ich dann auf der home.php die id des Users raus ?

    Zb per Session.

    Beim erfolgreichen Login kannst Du doch die id in die Session packen.

  • Ja ok.


    Nehmen wir an es sind 4 users (tom, hans, ulli, ochse) online. Nun postet Tom was. Wie will ich dann auf der home.php genau von ihm die id herausfinden ?


    Es gibt nur 1 ne home.php

  • Der User wird immer anhand der Session identifiziert in der seine User-ID hinterlegt ist. Du musst also diese beim Login dort speichern.


    Sagen wir mal, Tom loggt sich ein. Du speicherst dann seine ID, sagen wir mal 3, in der Session. Anschließend geht er auf die Startseite und will dort was posten. Er schickt das Formular ab. Nun gehst du hin und holst die ID aus der Session und speicherst anschließend seinen Beitrag in der entsprechenden Tabelle, inkl. seiner ID.

  • Ich verstehe es grad nicht.


    Wenn ich bei jedem Login eine session erstelle mit der id des users der sich eingelogt hat.

    PHP
    1. $_SESSION['userId'] = $fetchRow->id;

    Und sich jetzt dann ein weiterer einlogt ist diese session überschrieben. Aber dies kann man verhindern indem man den session namen in den ' ' mit den usernamen aus der datenbank füllt.


    Nun ist der User eingelogt auf der home.php, in der benutze ich dann session_start();. Dann hat jeder user seine eigene session. Aber wie will man dann wissen, dass genau dieser user ein beitrag gepostet hat ?

  • Eine Session ist nicht für alle da.

    Jeder User hat seine eigene.


    Grober Ablauf:

    - Script startet (zB Loginseite)

    - Du nutzt als erstes sesstion_start(); im Script

    - PHP erstellt (wenn nicht schon vorhanden) eine Datei auf dem Server (Pfad bekommst Du zB per session_save_path())

    - User loggt sich ein und Du setzt $_SESSION[id] = {user_id}

    - PHP schreib die Daten in die Datei auf dem Server

    - Scriptende


    Eine Session ist alse eigentlich eine Datei auf dem Server.

    Die Zuordnung passiert zB per Browsercookie.

  • Hey,


    aso. Also wird bei jedem login für jeden user eine eigene session angelegt ?


    Ich habe es nun hinbekommen, Wie findet ihr meinen Weg ? Und den Aufbau der Datenbank (-> siehe Anhang) ? Bitte um Rückmeldung.

    Hab ein kleines weiteres Problem: Ich muss die Seite erst neu laden, bis ich das Kommentar sehen kann. Wie kann man dies denn umgehen?


    Und script:


    Und so dann die Ausgabe:

    Dateien

    • db.PNG

      (6,8 kB, 1 Mal heruntergeladen, zuletzt: )
  • $id = $_POST['hidden']; // -> Session id

    Mach das nicht.

    Man könnte hier per (zB) curl eine POST-Request absenden und jede beliebige SESSION-id mitgeben.


    Besser:

    $id = $_SESSION['id'];

    Wenn ich jetzt per curl einen Beitrag absenden will, muss ich mir die Mühe machen Cookies mitzuschreiben.

    Und ich komme immernoch nicht weiter, weil ich nicht eingeloggt bin.

    Müsste also auch noch den Login per curl durchlaufen.

    Und genau hier bist Du sicher, dass nur ein Authentifizierter User die Möglichkeit hat, einen Beitrag zu posten.



    PHP
    1. foreach ($fetchAll as $beitraege) {
    2. echo '<article class="userbeitraege">';
    3. echo '<p>Gepostet von <a href="#">' . $beitraege['username'] .'</a></p>';
    4. echo '<p>' . $beitraege['beitrag'] . '</p>';
    5. echo "</article>";
    6. }

    Auch wenn die Daten in Deiner db liegen - es sind Userdaten.

    Nur, weil sie schon in der db sind, heißt das nicht, dass sie sicher sind. Im Prinzip sind auszugebende Daten (egal woher) immer zu maskieren.


    htmlspecialchars() ist neu:

    Code
    1. foreach ($fetchAll as $beitraege) {
    2. echo '<article class="userbeitraege">';
    3. echo '<p>Gepostet von <a href="#">' . htmlspecialchars($beitraege['username']) .'</a></p>';
    4. echo '<p>' . htmlspecialchars($beitraege['beitrag']) . '</p>';
    5. echo "</article>";
    6. }

    Du kannst das mal testen, in dem Du das hier mal manuell in deine db schreibst (zB ins feld 'beitrag'): <script>alert('ich hab mich ion deine db geschlichen :p')</script>

    Ohne htmlspecialchars wird der Browser den JS code ausführen.




    Um den Beitrag, der gerade gespeichert wurde, mit in die Liste zu bekommen, musst Du die Beiträge erst nach der Beitragerstellung laden.

    - lade User aus der db

    - speichere neuen Beitrag des Users

    - lade alle Beiträge



    Zur Tabelle:

    Es gibt viele Wege. Vorallem auch kompliziertere zB mit Versionen des Beitrags. Aber das würde hier den Rahmen sprengen.


    Grundlegendes sollte aber immer dabei sein:

    - wer (ident - user id)

    - was (beitrag)

    - wann (datum|created_at)


    Später kannst Du das erweitern. Zb wenn Der User seinen Beitrag editieren kann|darf, dann erweiterst Du die tabelle um updated_at.

    Evtl willst Du als Admin auch mal Beiträge entfernen. Dann köntest Du ein Feld is_active (0 oder 1) hinzufügen.

    Usw.

  • Hey,


    vielen Dank für die Hilfe.


    Gut zu wissen. Habe nun dies auch so gemacht.


    Ja ich filtere die Daten ja schon bevor sie in die Datenbank kommen. Braucht man da dann unbedingt htmlspecailchars ?


    Ok. Ich möchte erstmal den Grundbau dieses Kommentarsystems schaffen mit allem nötigen. Und es dann mit weiteren Funktionen ausstatten und dann verfeinern, dass es eines Tages ein richtiges Kommentarsystem ist wie man es z.b. auf Social-Media-Plattformen sieht.



    Gruß,

    Stef

  • Ja ich filtere die Daten ja schon bevor sie in die Datenbank kommen. Braucht man da dann unbedingt htmlspecailchars ?

    Ja. Wie gesagt - alle Daten die raus gehen (hier im Bsp zum Browser) gelten als unsicher.


    Probier mal das Bsp mit dem alert. Egal wie das in die db kommen könnte - es kann passieren. Und wenn Du die db Daten dann als sicher ansiehst, hast Du verloren.

  • Ja ok. Da hast du recht. Habe immer gedacht dass in db nur sichere Daten stehen. Dann werde ich ab jetzt immer dies mitbeachten.


    Danke