Forum - bei neuen Beiträgen/Einträgen in MySQL Grafik ändern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
aufleuchten
benutzer
button
code
datenbank
datum
ergebnis
forum
funktion
gesonderten tabelle
grafik
set
spalte
spalten
speichern
symbol
tabelle
update
woche
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
Ooops! Hast recht, so kann man das auch verstehen.
Möge uns der Threadersteller Auskunft über sein Begehr geben. ;)
FF -
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 -
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 -
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 ;) -
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. -
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 -
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 -
@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...) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage