Forum gelesen bzw. ungelesene Threads markieren

sonicks

Erfahrenes Mitglied
Hi,

Ich weiß, dass dieses Thema schon einmal behandelt worden ist, doch man ist nirgends zu einer brauchbaren Lösung gekommen.

Zu meinem Problem:

Ich habe ein Forum, bei dem, wie bei jedem Forum eigentlich ist, angezeigt werden soll, wenn es ungelesene Threads gibt (Mit so einem kleinen Ordner oder wie auch immer, ich denke ihr wisst was ich meine.)

Bisherige Lösung:

Ich habe den Timestamp des letzten Logins eines Users mit dem Timestamp des letzten Threads verglichen und somt herrausgefunden, welche Threads seit dem letzten Besuch neu sind . Wenn man aber mehrere ungelesene Threads hat, und man klickt einen an, werden die anderen auch als ungelesen markiert. Und das ist ja nicht wirklich der Sinn der Sache.

2. Möglichkeit:

Ich habe mir überlegt, eine extra Tabelle anzulegen,

threadid
userid
time

und alle gelesenen Threads dort einzutragen. Das würde theoretisch auch den gewünschten Effekt bringen, nur wird diese Tabelle bei mehreren Usern unendlich groß. Und ich denke nicht, dass es bei großen Foren so gelöst wurde.


Wen jemand eine andere Möglichkeit weiß, bitte melden!

MfG sonicks
 
sicher bin ich mir nicht, aber ich meine irgendwo gelesen zuhaben, dass große systeme das mit einer zelle 'read' lösen, die entweder 1 oder 0 ist. kA ob dir das hilft, wie gesagt, das fiel mir eben so ein.
 
Wenn du es wie z.B. das wbb machen willst installiere dir dieses und schau den Aufbau an.

Arbeite doch so das die markiert werden ,die du gelesen hast und alle andern eben nicht ,am besten auch noch per Cookie um die Serverlast möglichst kleinzuhalten ,also :
PHP:
 if($_COOKIE['read'] != 1){
 echo <img src=ungelesen.gif>
}else{
 echo <img src=read.gif>
}
Hoffe du kannst meinen Ansatz nachvollzeihen.
 
@therealcharlie:

Nein, das Problem ist, dass es ja mehrere User gibt, die auf das Forum zugreifen. Trotzdem danke!

@KristophS

Das wäre eine andere Möglichkeit, aber dann hätte jeder User einen neuen Cookie bei jedem Mal wenn er einen Thread anklickt.
Außerdem gibt es viele User, die regelmäßig ihre Cookies löschen. Und dann wären alle Threads wieder als ungelesen markiert.

Ich habe schon versucht bei einem WBB Board nachzuschauen, aber ich werde aus diesem WBB Code nicht schlau. Falls jemand einen Auszug hat, oder weiß wie das andere Foren lösen, kann er mir das gerne näher bringen.
 
Ich weisz, dass zumindest einige Foren deine zweite Moeglichkeit benutzen. SO viel mehr Serverlast ist das gar nicht, wenn der Server also nicht sowieso schon ueberlastet ist, sollte das gehen.

Das mit den Cookies produziert halt Muell beim User, den der vielleicht nicht haben will.
 
Ein weiterer Ansatz wäre der, dass du für jeden Thread eine zusätzliche Spalte hast, in der mit & oder irgendeinem anderen Sonderzeichen getrennt die ID's aller User stehen, die den neusten Beitrag noch nicht gelesen haben. Die kannst du dann mit regex ausfiltern bzw. modifizieren.
 
So weil sonicks es nicht entziffern konnte was ich meine schreibe ich nochmal alles neu :)

Ich würde es nicht so machen, dass man zb. in der Datenbank noch eine Tabelle (zb."post_check") anlegt, welche die Spalten "uid", "last_visit", "post_ids", "last_update" beinhaltet. Man könnte es auch über Cookies speichern, aber wir gehen mal davon aus, dass jeder die cookies abgeschalten hat ;)

In der ganzen Datensätze werden nach, sagen wir 15 Minuten gelöscht, wenn es nicht aktualisiert wird.

PHP:
$sql = "DELETE * FROM post_check WHERE DATE_SUB(NOW(), 15 MINUTE) > last_update";
mysql_query($sql);

Wenn nun ein Besucher sich auf der Seite einloggt wird in der tabelle überprüft, ob schon ein Datensatz besteht für diesen Besucher. Wenn kein Datensatz gefunden wurde, dann erstellt er einen neuen, indem er aus der Tabelle mit den Besucherdaten (zb. "users") die Zeit ermittelt, wann er das letzte Mal auf dieser Seite war (zb. Feld heisst "last_logged_in"). Nun erstellt er eine Array für das Feld "last_visit". Die Datenfelder für das Array entsprechen der Anzahl de Foren.

Die Variable sollte ungefähr so aussehen:
PHP:
$rlast_logged_in = mysql_query("SELECT users.last_logged_in WHERE id='$id'");
$ilast_logged_in = mysql_fetch_array($rlast_logged_in);

$ranzahl = mysql_query("SELECT count(*) as count FROM foren";
$ianzahl = mysql_fetch_array($ranzahl);

for($i = 0; $i < $ianzahl['count']; $i++)
{
 $last_visit[$i] = $ilast_logged_in['last_logged_in'];
}

$str_lst_visit = implode("|", $last_visit);

Diese Sachen schreibt ihr nun in die Tabelle "post_check":
PHP:
$sql = "INSERT INTO post_check (uid, last_visit, post_ids, last_update) VALUES ('$id', '$str_last_visit', '0', 'NOW()')";
mysql_query($sql) or die("blabla");

Wenn ihr nun in irgendein Forum rein geht, dann liest er diesen Datensatz aus und überprüft die Variable $last_visit:
PHP:
$rpost_check = mysql_query("SELECT * FROM post_check WHERE uid='$id');
$apost_check = mysql_fetch_array($rpost_check);

$alast_visit = explode("|", $apost_check['last_visit']);

$apost_id = explode("|", $apost_check['post_ids']);

if(count($apost_id) == 0)
{
 $sql = "SELECT * FROM forum_posts WHERE time_post > $alast_visit[$forum_id]";

//Postings in das Array $apost_id eintragen, die nach dem Verlassen der Page erstellt wurden
// alle Post-IDs müssen in ein Datensatz gespeichert werden.
// Also zb. $apost_id[$forum_id] = "post_ID1|post_ID|..."
}
else
{
 //Posts auslesen und an das Array $apost_id anhängen
}

Nun musst du die erhaltenden Postings in das Array $apost_id eintragen. Das Array wird in der Tabelle "post_check" genauso gespeichert, wie $last_visit. Also wieder mit [phpf]implode[/phpf] in einen String umwandeln.

So nun kannst du mit dem Anzeigen der Seite beginnen. Du hast nun in dem Du hast in dem Array $apost_id nun alle Beiträge stehen, die noch nicht angeschaut wurden. Normal hast du bei einem Thema (hab Forum so aufgeteilt: Kategorie->Forum->Thema->Beitrag) die ID stehen, des letzten Beitrags, der erstellt wurde zu diesem Thema. Nun suchst du in deinem Array danach und wenn sich was findet dann kannste dieses Thema als ungelesen markieren.

Nun musst du aber noch ein Update der Tabelle "post_check durchnehmen. Als erstes musst du die Variable $apost_id speichern und dann musst du auch die variable $alast_visit speichern. Aber vorher musst du diese aktualisieren. Damit das Forum weiß, dass du noch online bist.

PHP:
$alast_visit[$forum_id] = time();

Wenn du nun ein Thema anklickst, dann muss er aus der Spalte "post_ids" in der Tabelle "post_check" alle Beiträge rausnehmen, die sich in diesem Thema befinden, weil du ja gerade imstande bist sie zu sehen.

Nun müsstest du eben immer die ungelesenen Beiträge sehen. Ausser wenn du dich ausloggst und nach ein paar Stunden wieder kommst wirst du nicht mehr die ungelesenen Beiträge sehen, die du beim letzten Login _nicht_ gelesen hattest. Aber ich denke das ist nicht so schlimm.

Schlag mich wenns irgendein Fehler gibt und ich übernehme keine garantier dafür, dass der code stimmt. ist ja nur eine Anregung :)
 
Zuletzt bearbeitet:
So...

Danke für eure Antworten!

@KoMtuR

Vielen Danke, dass du dir so viel Mühe gegeben hast, aber ich kann deinem ganzen Post nicht ganz folgen. Vielleicht liegt es an mir, da ich ziemlich übermüdet bin, ich werd mir das später nochmals konzentriert durchlesen. Ist aber teilweise bißchen unübersichtlich.

@SilentWarrior

Die Idee hört sich gut an, nur habe ich damit noch keinerlei Erfahrung. Wäre echt nett von dir wenn du mir es ein bißchen genauer erklären kannst, wie es genau umsetzen könnte
 
Hab einfach mal meine Gedanken über den Haufen geworfen und hier gepostet. Könnte es glaub ich nochmal ohne alle Zusätze machen aber da müsste ich ja nochmal soviel schreiben. Aber ich denke jemand wird es nochmal verständlich erklären. :)

Ich mach dann nochmal ein Edit. Aber erst später wenn ich wieder Zeit habe.

So ich hoffe nun versteht man es :)
 
Zuletzt bearbeitet:
Also ich habe es jetzt mal probiert, komme aber nicht wirklich weiter.

Weiß denn niemand, wie das bei WBB gemacht wird? Vom Sinn her? Von dem WBB Code werd ich nicht schlau.
 
Zurück