Konzept für Tabellenaufbau

  • Hallo liebe forum-hilfe Gemeinschaft,

    ich habe vor ein paar Wochen mit einem neuen Projekte begonnen und würde nun gerne ein Bewertungssystem einbauen. Bewerten kann man Produkte, welche User in die DB eintragen können. Abgesehen davon will ich auch noch eine Pinnwand für jedes Produkt einführen.

    Mit einem Daumen nach oben, soll man ein Produkt mit +1 bewerten können und mit einem Daumen nach unten eben mit -1.
    Jedes Produkt erhält eine Pinnwand, wo Leute ein Feedback hinterlassen können (also sowas in die Art Gästebuch).

    Das selber zu programmieren ist kein Problem, das Problem liegt bei dem Tabellenaufbau, denn ich muss für das ganze auch noch eine IP Sperre einführen, sprich ein User kann mit seiner IP ein Produkt nur 1mal bewerten.

    Ich habe derzeit in meiner Datenbank (MySql) eine Tabelle namens "Produkte". Dort steht unter anderem die "id", der "Titel" und eine "Beschreibung" des Produkts.
    Beim eintragen eines Produktes wird es in die Tabelle "Produkte" geschrieben. In diese Tabelle würde noch eine Spalte mit Stimmen hinzukommen, sprich wenn 10 Leute auf "Daumen nach oben" klicken, hat das Produkt die Zahl 10 in der Spalte Stimmen.

    Für die IP überprüfung bräucht ich jetzt aber für jedes Produkt eine neue Tabelle, da ich ja alle Ip Adressen, die bereits abgestimmt haben, in die DB eintragen muss, um erneute Bewertungen zu verhindern.

    Habe ich nun 1000 Produkte in der Tabelle "Produkte" stehen, brauch ich für jedes einzelne Produkt eine Tabelle - das wären tausend Tabellen - und in jeder dieser Tabellen können wiederum tausende von Ip Adressen stehen. Hinzu kommt noch, dass jedes Produkt ne Pinnwand bekommt. User können ihren Namen + eine Nachricht hinterlassen. Name und Nachricht werden in die Tabelle eingetragen, wo auch die Ip Adressen stehen, die bereits abgestimmt haben.

    Ich hab dann also enorm viele Tabellen und diese haben wiederrum enorm viel Inhalt - ich nehme mal an das wirkt sich dann auch sehr stark auf die Ladezeiten aus?

    Also was mich interessiert ist, wie man ein Bewertungssystem und eine Pinnwand für jedes Produkt mit möglichst wenig Tabellen hinbekommt.
    Ich hoffe ich habe mich verständlich ausgedrückt :)

    Mit freundlichen Grüßen

  • Erstell für die Bewertungen eine (!) zweite Tabelle. Diese sollte aus den Spalten

    produktid
    ip
    bewertung

    bestehen. "produktid" sollte mit der "id" aus "produkte" gefüllt sein, in ip die IP des Besuchers und bei "bewertung" jeweils "-1" oder "1" - nichts anderes. Ein Datensatz sähe dann so aus:

    42 | 1.2.3.4 | -1

    So kannst Du für ein Produkt dann die Bewertungen summieren:

    Code
    select SUM(bewertungstabelle.bewertung) from produkte
    left join bewertungstabelle on bewertungstabelle.produktid = produkte.id
    group by produkte.id

    Soweit klar? Du brauchst nicht unnötig viele Tabellen. Das was Du machen musst nennt sich Normalisierung deines Datenbankmodells. Und dabei käme o.g. vorgehen heraus.

    Btw. ist eine Sperre per IP ungenügend. Nicht jeder Nutzer hat ständig die selbe ip. Manche haben dank Proxy-Netzwerken auch bei jedem Aufruf der Seite eine andere IP. Besser ist eine Kombination aus IP, Browser und ggfs. auch Bildschirminfo sowie eine Zeitsperre (nur 1 mal täglich oder ähnlich).

  • Hallo threadi,

    danke erstmal für deine Antwort.


    Brauche 4 Felder für die Pinnwand: id(damit ich die Einträge den Produkten zuordnen kann), Name, Message und Abschicksdatum.

    Wenn ich für die ganze IP Sperre Nur ein Tabelle brauch, kann ich doch praktisch die ganzen Pinnwänder Einträge auch in einer Tabelle sammeln!?
    Sehe ich das so richtig?

    liebe grüße

  • Das siehst du so richtig, passe aber bischen mit der Namensgebung und Großkleinschreibung auf

    Empfehlenswert ist in der DB kleinschreibung auf english


    mfg

  • Hi Pion,

    alles klar, ich werde darauf achten.

    Habt mir sehr weitergeholfen, danke euch vielmals!

    liebe grüße

  • Hi Leute,

    sitzte gerade an der Pinnwand, derzeit aber ohne großen Erfolg :(

    Ich hab nun in meiner Datenbank eine Tabelle namens "pinnwand" erstellt.
    Wie schon erzählt erhält jedes Produkt eine eigene Tabelle.

    So sieht die Tabelle Pinnwand aus:

    +----+--------+--------+-------+
    | i d | datum | name | inhalt |
    +----+--------+--------+-------+
    +----+--------+--------+-------+
    | 1 | 2010 | test | blabl |
    | 1 | 2010 | test | blabl |
    | 1 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    +----+-------+----------+------+


    Problem: fehlerhaftes auslesen der Pinnwandeinträge:

    Per Suche kann man nach Produkten suchen. Neben jeden Produkt steht folgender Link:

    <a href="index.php?action=pinnwand&produkt='.$produkt->id.'">Pinnwand</a>

    Die Variable "$websites->id" enthält die id des Produktes. Wenn man auf oberen Link klickt, wird man auf die index.php weitergeleitet und dort wird überprüft, welchen Wert die Variable "action" enthält, in dem Fall ist der Wert der Variable "pinnwand" - dadurch wird die pinnwand.php includet.
    In der pinnwand.php überprüfe ob die produkt id überhaupt existiert, wenn nicht, wird alles abgebrochen, ansonsten werden die Einträge die mit der id übereinstimmen ausgegeben.
    Leider wird bei allen Produkte alle Einträge ausgegeben. Wenn ich auf das Produkt mit der id 1 klicke, sollen natürlich lediglich die Einträge mit der id 1 ausgegeben werden.

    Was mache ich bei der abfrage falsch? Hier das Code Stückchen für die Abfrage:


    $pwEintraege = "SELECT `datum`, `name`, `inhalt` FROM `pinnwand` WHERE `id` LIKE '$produktid'";
    $pwEintraege = mysql_query($pwEintraege);

    while($pwEintraege = mysql_fetch_object($pwEintraege))
    {
    echo '<p>'.$pwEintraege->datum.''.$pwEintraege->name.''.$pwEintraege->inhalt.'</p>';
    }

    In der ersten Zeile sag ich doch, dass ich nur den Inhalt der Felder "datum", "name" und "inhalt" haben möchte, wenn deren id mit der produktid übereinstimmen. Dennoch wird mir beim zweiten Produkt mit id 2 die Einträge mit der ID 1 ausgegeben.
    Abgesehen davon bekomm ich folgende Meldung:

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\inetpub\vhosts\mc-web.net\httpdocs\pinnwand.php on line 64


    Tschuldigung das ich euch so volltexte, aber ich komm da einfach nicht weiter :(

    liebe grüße

  • Bitte den vorigen Beitrag löschen, da er fehlerhaft ist.

    Hi Leute,

    sitzte gerade an der Pinnwand, derzeit aber ohne großen Erfolg

    Ich hab nun in meiner Datenbank eine Tabelle namens "pinnwand" erstellt.

    So sieht die Tabelle Pinnwand aus:

    +----+--------+--------+-------+
    | i d | datum | name | inhalt |
    +----+--------+--------+-------+
    +----+--------+--------+-------+
    | 1 | 2010 | test | blabl |
    | 1 | 2010 | test | blabl |
    | 1 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    | 2 | 2010 | test | blabl |
    +----+-------+----------+------+


    Problem: fehlerhaftes auslesen der Pinnwandeinträge:

    Per Suche kann man nach Produkten suchen. Neben jeden Produkt steht folgender Link:

    <a href="index.php?action=pinnwand&produkt='.$produkt->id.'">Pinnwand</a>

    Die Variable "$produkt->id" enthält die id des Produktes. Wenn man auf oberen Link klickt, wird man auf die index.php weitergeleitet und dort wird überprüft, welchen Wert die Variable "action" enthält, in dem Fall ist der Wert der Variable "pinnwand" - dadurch wird die pinnwand.php includet.
    In der pinnwand.php überprüfe ob die produkt id überhaupt existiert, wenn nicht, wird alles abgebrochen, ansonsten werden die Einträge die mit der id übereinstimmen ausgegeben.
    Leider wird bei allen Produkte alle Einträge ausgegeben. Wenn ich auf das Produkt mit der id 1 klicke, sollen natürlich lediglich die Einträge mit der id 1 ausgegeben werden.

    Was mache ich bei der abfrage falsch? Hier das Code Stückchen für die Abfrage:


    $pwEintraege = "SELECT `datum`, `name`, `inhalt` FROM `pinnwand` WHERE `id` LIKE '$produktid'";
    $pwEintraege = mysql_query($pwEintraege);

    while($pwEintraege = mysql_fetch_object($pwEintraege))
    {
    echo '<p>'.$pwEintraege->datum.''.$pwEintraege->name.''.$pwEintraege->inhalt.'</p>';
    }

    In der ersten Zeile sag ich doch, dass ich nur den Inhalt der Felder "datum", "name" und "inhalt" haben möchte, wenn deren id mit der produktid übereinstimmen. Dennoch wird mir beim zweiten Produkt mit id 2 die Einträge mit der ID 1 ausgegeben.
    Abgesehen davon bekomm ich folgende Meldung:

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\inetpub\vhosts\mc-web.net\httpdocs\pinnwand.php on line 64


    Tschuldigung das ich euch so volltexte, aber ich komm da einfach nicht weiter

    liebe grüße

  • So, ich nochmal. Hatte eine kleinen Fehler bei der Variablenbezeichnung eingebaut - jetzt funktioniert alles,
    die Fehlermeldung ist aber nachwievor da:

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\inetpub\vhosts\mc-web.net\httpdocs\pinnwand.php on line 63


    Ich nehme mal an, dass liegt daran, dass ich mehrere Datensätze mit der selben id abfrage... Welche alternative zu mysql_fetch_obejct gibt es?

    liebe Grüße

  • Nein, diese Meldung kommt, wenn Du ein Statement ausführen willst, welches einen Fehler verursacht hat. Lass dir also das Statement mal ausgeben, welches Du für diese Ausgabe verwenden willst und führe das im phpmyadmin aus.

  • Das sql statement kann nicht (komplett) falsch sein? - mir werden ja die Daten, die ich abfrage ganz normal übermittelt.

  • Komplett nicht, aber vielleicht ein Schreibfehler oder ein Syntaxfehler durch eine eingefügte Variable. Kann man alles nicht beurteilen, wenn Du nicht den kompletten Quellcode zeigst. Und wie gesagt: prüfe das Statement.

  • hilfreich in diesem Zusammenhang: mysql_error

    PHP
    $pwEintraege = "SELECT `datum`, `name`, `inhalt` FROM `pinnwand` WHERE `id` LIKE '$produktid'";
    $pwEintraege = mysql_query($pwEintraege) or die(mysql_error());
    
    
    while($pwEintraege = mysql_fetch_object($pwEintraege))
    {
    echo '<p>'.$pwEintraege->datum.''.$pwEintraege->name.''.$pwEintraege->inhalt.'</p>';
    }


    Die Fehlermedlugn die du erhältsts bedeuted, dass dein SQL-Statement falsch ist (wie threadi schon sagte). Da gibt es kein "nicht komplett falsch". Entweder es ist valide oder nicht.


  • Hi,

    ich habe den Fehler bereits gefunden. Da ich in der Tabelle mehrere Einträge mit der ID 1 hatte, haben sich die variablen wo die ids gespeichert wurden immer überschrieben und daher funktionierte das mysql fetch object nicht- jetzt klappts.


    grüße