kostenloser Webspace werbefrei: lima-city


Forum - bei neuen Beiträgen/Einträgen in MySQL Grafik ändern

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fischbroetchen

    fischbroetchen hat kostenlosen Webspace.

    Hallo zusammen,
    ich bin gerade an einem Forum, aber ich scheitere immer an einer Funktion:

    Falls ein Benutzer einen Thread / Beitrag noch nicht angeklickt hat, soll ein Button aufleuchten ( Grafik wird gewechselt). Wie bekomme ich das hin? Aus den phpBB Codes wurde ich leider auch nicht schlau.

    Vielen Dank!

    Grüße,
    Fischbrötchen
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du kannst entweder in der Datenbank speichern, ob der User diesen Thread schon gesehen hat oder du machst es mit Sessions.

    LG cookies
  4. fischbroetchen schrieb:

    Falls ein Benutzer einen Thread / Beitrag noch nicht angeklickt hat, soll ein Button aufleuchten ( Grafik wird gewechselt). Wie bekomme ich das hin? Aus den phpBB Codes wurde ich leider auch nicht schlau.


    Das ist bei phpBB doch eine Standardfunktion. Ungelesene Topics und Foren werden doch hervorgehoben, sofern das Template das unterstützt und die Funktion im Adminbereich aktiviert ist.

    @cookies: Nicht nötig, darum kümmert sich phpBB selbst.

    FF
  5. fatfreddy schrieb:
    fischbroetchen schrieb:

    Falls ein Benutzer einen Thread / Beitrag noch nicht angeklickt hat, soll ein Button aufleuchten ( Grafik wird gewechselt). Wie bekomme ich das hin? Aus den phpBB Codes wurde ich leider auch nicht schlau.


    Das ist bei phpBB doch eine Standardfunktion. Ungelesene Topics und Foren werden doch hervorgehoben, sofern das Template das unterstützt und die Funktion im Adminbereich aktiviert ist.

    @cookies: Nicht nötig, darum kümmert sich phpBB selbst.

    FF


    Ich denke eher, er will ein eigenes Forum programmieren und guckt nur bei phpBB, wie alles funktioniert.

    LG cookies
  6. Ooops! Hast recht, so kann man das auch verstehen.

    Möge uns der Threadersteller Auskunft über sein Begehr geben. ;)

    FF
  7. Autor dieses Themas

    fischbroetchen

    fischbroetchen hat kostenlosen Webspace.

    Hallo,
    also ich versuche mich selber an einem eigenen Forum ;-)
    Dabei habe ich eigentlich fast alles schon so weit, nur das mit dem Buttonwechsel bei noch nicht gelesenen Threads.

    @cookies: Wie meinst du das mit der Datenbank? Ich kann ja nicht bei jedem User ne Bestätigung hinmachen, dass der den Beitrag schon gelesen hat, das werden ja unmengen.

    Vielen Dank

    Grüße
    Fischbrötchen
  8. Ich weiß nicht, ob das die effektivste Möglichkeit ist, aber so würde es gehen:

    In einer Tabelle gelesen gibt es die Spalten Username, Thread-ID, ... . Dann kann man folgende SQL-Queries benutzen:

    zum als-Gelesen-Markieren:
    INSERT INTO gelesen SET Username = 'USERNAME', Thread-ID = 'THREAD-ID'

    zum Testen, ob gelesen:
    SELECT COUNT(*) AS anzahl FROM gelesen WHERE Username = 'USERNAME' AND Thread-ID = 'THREAD-ID'

    Das gibt anzahl=1 zurück, wenn der Thread schon gelesen ist.

    LG cookies
  9. Autor dieses Themas

    fischbroetchen

    fischbroetchen hat kostenlosen Webspace.

    Ok vielen Dank, ich denke so werde ich es machen, wenn auch es eine sehr speicherfressende Möglichkeit ist. Falls wer noch eine Lösung parrat hat, ich bin für alles offen :)

    Grüße
    Fischbrötchen

    PS: Danke "cookies", hast mir sehr geholfen ;)
  10. Du könntest alternativ auch in der Tabelle mit Deinen Threads eine Spalte einfügen, die speichert, welche User diesen Thread bereits gelesen haben (alle hintereinanderweg, durch Separator getrennt. Das könnte z.B. so aussehen

    Feld 'gelesen' [typ z.B. TEXT, damit keine Längenbeschränkung den Feldinhalt begrenzt]: 1|15|7|28 etc.


    Wenn ein User einen Thread zum lesen öffnet
    $ergebnis = mysql_query("SELECT * FROM threads WHERE id='$id'");
    $threaddaten = mysql_fetch_object($ergebnis);
    if (!in_array($userid,split("[|]",$threaddaten->gelesen));
    {
       mysql_query ( "UPDATE threads SET gelesen ='".$threaddaten->gelesen."|".$userid."' WHERE id='".$threaddaten->id."');
    }


    Wenn abgefragt werden soll, ob dieser User den Thread schon gelesen hat, kann man wieder die Abfrage

    if(in_array($userid,split("|",$threaddaten->gelesen)) .......


    ausführen und dementsprechend das Symbol einblenden.

    Der Code ist ungetestet. Sollte aber so - oder so ähnlich - funktionieren. Diese Art der Speicherung verwende ich auch bei meinen Projekten so ähnlich.
  11. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Das von Cookies hab ich grad nur kurz überflogen, aber da defintiv noch was fehlt, hier nochmal in aller Gänze:

    Du brauchst eine Tabelle, die die User/Thread-Kombination erfasst + Datum (ist hier sehr wichtig). Ich persönlich nutze dazu, das TIMESTAMP-Format, aber das ist Geschmackssache.

    Brauchst also folgende Spalten:
    ID (Primary Key)
    UserID
    ThreadID
    Datum


    Folgende Bedingungen müssen also zutreffen, damit "Neue Postings!" aufblinkt:
    - UserID muss mit laufender Session-ID übereinstimmen (soll ya nur für den betreffenden User sein!)
    - ThreadID muss mit gelistetem Thread in der Forenübersicht übereinstimmen (soll ya nur für den betreffenden Thread stimmen)

    und nun das Wichtigste:

    - Datum muss < kleiner als das Datum des letzten Postings sein. (Denn sonst kriegst du das Symbol bei neuen Postings nicht mehr an.)

    Das bedeutet natürlich auch, dass du bei einem "Neuen Postings!"-View auch das Datum updaten musst, sofern das letzte Kriterium erfüllt war. Gibt es dieses nicht, kannst du es anlegen, daher empfehle ich dir auch den Einsatz von "ON DUPLICATE", das ist hier recht praktikabel.

    Datenfresser beseitigen:

    Du könntest bei yedem User-Login im Hintergrund ein Script laufen lassen, dass alle Einträge, die älter sind als 2 Wochen löschen lassen. In diesem Zeitraum sind die meisten Threads dann sowieso schon auf Seite 5 oder mehr. Um dann aber nicht alle alten Thread als "Neu" da stehen zu haben, prüfst du zusätzlich beim Auflisten, ob der Thread älter als 2 Wochen ist und setzt ihn dann definitiv auf "Ungelesen".

    Hoffe ich konnte dir helfen.

    Edit:
    Mitsche war schneller, allerdings habe ich hier einen kleinen Kritikpunkt. Und zwar wäre das Entfernen einzelner Einträge deutlich Ressourcenfressender, als es in einer gesonderten Tabelle der Fall wäre. Denn du müsstest dann zuerst ALLE Spalten auslesen, splitten, betreffende entfernen, Liste neu erstellen, UPDATE.

    Bei einer gesonderten Tabelle, würde allerdings ein einziger Befehl reichen: DELETE FROM viewed_threads WHERE UserID = X

    Je nach dem, wie besucht dein Forum dann mal wird, sprechen wir hier von einer Zeitdifferenz von mehreren Sekunden, zwischen den beiden Möglichkeiten.

    Liebe Grüße
    - VampireSilence

    Beitrag zuletzt geändert: 8.11.2009 20:40:48 von vampiresilence
  12. Ich hatte das Problem so verstanden, dass grundsätzlich nur abgefragt werden soll OB der Thread schon gelesen wurde und bin nicht von einer Löschmöglichkeit ausgegangen. Mein Codeschnipsel verhindert nur eine weitere Tabelle.

    Ich gebe vampiresilence recht, dass die Löschmöglichkeit am besten über die weitere Tabelle implementiert werden sollte.

    Aber, wieso soll der gelesene Beitrag eigentlich gelöscht werden?

    Und wenn absolut nur neue markiert werden sollen (also wirklich nur Postings, die seit dem letzten Login hinzugekommen sind), dann reicht es meiner Meinung nach aus, die Threads mit Erstellungsdatum / -zeit zu speichern und dann mit dem Datum des letzten Logins abzugleichen.

    Beitrag zuletzt geändert: 8.11.2009 21:15:43 von rnitsche
  13. @rnitsche: Ich hasse es einfach, wenn Leute ihre Datenbanken nicht normalisieren. Wenn dann jemand anders außer dir an deinem Proggi weitermacht, ist das die reinste Qual da Haufenweise Daten zu portieren. Und alle User in eine Spalte zu speichern ist verstoß gegen die erste Normalform, Atomität, also ganz böse.

    @vampire: Warum eine ID? Ist nicht ( UserID , ThreadID ) ein guter Primary? (Zudem danach gesucht wird...)
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!