ERLEDIGT
NEIN
NEIN
ANTWORTEN
14
14
ZUGRIFFE
517
517
EMPFEHLEN
-
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
-
27.06.04 15:23 #2
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 :
Hoffe du kannst meinen Ansatz nachvollzeihen.PHP-Code:if($_COOKIE['read'] != 1){
echo <img src=ungelesen.gif>
}else{
echo <img src=read.gif>
}
-
@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.
-
27.06.04 16:05 #6
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.
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.PHP-Code:$sql = "DELETE * FROM post_check WHERE DATE_SUB(NOW(), 15 MINUTE) > last_update";
mysql_query($sql);
Die Variable sollte ungefähr so aussehen:
Diese Sachen schreibt ihr nun in die Tabelle "post_check":PHP-Code:$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);
Wenn ihr nun in irgendein Forum rein geht, dann liest er diesen Datensatz aus und überprüft die Variable $last_visit:PHP-Code:$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");
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 implode() in einen String umwandeln.PHP-Code:$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
}
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.
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.PHP-Code:$alast_visit[$forum_id] = time();
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
Geändert von KoMtuR (27.06.04 um 18:16 Uhr)
-
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
Geändert von KoMtuR (27.06.04 um 18:18 Uhr)
-
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.
-
28.06.04 23:10 #11Mach ich doch gerne.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
Ich nehme mal an, die Probleme beziehen sich auf die RegExp, die zusätzliche Spalte in der Thread-Tabelle sollte keine Probleme machen.
Also mal vorausgesetzt, du hast die einzelnen Id's mit & getrennt, dann sieht das Script zur Entschlüsselung folgendermassen aus:So, ich hoffe, das war jetzt einigermassen verständlich. Ich weiss, dass es teilweise recht verwirrend ist, aber da ich die genaue Struktur deines Forums nicht kenne, kann ich dir leider keine genaueren Infos geben. Viel Erfolg wünsche ich schonmal!PHP-Code:$text = "1&5&4&33&23&6";
$array_mit_den_einzelnen_ids = explode("&",$text);
// in diesem Array befinden sich jetzt alle einzelnen Id's
// jetzt wird überprüft, ob die Id schon drin ist ("Ich bin drin" *g*)
// $id ist die Id, die überprüft werden soll
if (in_array($id,$array_mit_den_einzelnen_ids)) {
// bingo, ist schon drin. d.h.h der User hat die neusten Beiträge noch nicht gelesen -> Lämpchen (oder was auch immer) anzeigen
} else {
// nope, der ist schon auf dem neusten Stand. Das Lämpchen bleibt aus.
}
// hinzufügen kannst du einfach folgendermassen (ich denke, das sollte kein Problem sein - hinzufügen natürlich nur, wenn die Id noch nicht drin ist):
$text = $text . "&" . $id;
//oder kurz:
$text .= "&" . $id;
-
So, war die letzten Tage leider nicht online.
SilentWarrior: Ich habe deine Version jetzt probiert, und auch verstanden. Nur der Code von dir funktioniert nicht wirklich. Natürlich habe ich auch alles umgewandelt, ging aber trotzdem nicht.
Vielleicht weißt du ja selber den Fehler oder ich bin einfach zu dumm.
Vielen Dank für eure Mühen
MFG snx
-
05.07.04 12:15 #13
Was funktioniert denn genau nicht? Folgender Code funktioniert bei mir prima (Anzeige der einzelnen Array-Elemente):
Das hier funktioniert auch:PHP-Code:$text = "1&5&4&33&23&6";
$array = explode("&",$text);
foreach ($array as $id) {
echo $id . " ";
}
In diesem Fall wird "Licht aus!" angezeigt, wenn $id 1 ist, wird natürlich "Licht an!" ausgegeben. Und das:PHP-Code:$text = "1&5&4&33&23&6";
$array = explode("&",$text);
$id = 2;
if (in_array($id,$array)) {
echo "Licht an!";
} else {
echo "Licht aus!";
}
bzw. das:PHP-Code:$text = "1&5&4&33&23&6";
$id = 2;
$text = $text . "&" . $id;
echo $text;
funktioniert auch wunderbar. Also wenn du mir genauere Infos gibst, helf ich dir natürlich, aber zumindest im Moment seh ich da noch keinen Fehler.PHP-Code:$text = "1&5&4&33&23&6";
$id = 2;
$text .= "&" . $id;
echo $text;
-
Super danke!
Jetzt funktioniert alles, NUR das mit dem in die Tabelle einfügen klappt nicht ganz, der trägt entweder gar nichts ein oder nur die Zahlen ohne die & .
Irgendwelche Vorschläge?
Vielen Dank für alles!
//edit Es funktioniert nun alles! Vielen Dank an alle, es klappt jetzt perfekt und benötigt auch nicht allzuviel Speicher!
MFG snxGeändert von sonicks (05.07.04 um 15:35 Uhr)
-
...aber verstösst gegen die 1. NS
Ähnliche Themen
-
Nachricht öffnen und als gelesen markieren
Von thehasso im Forum Javascript & AjaxAntworten: 11Letzter Beitrag: 04.05.09, 18:14 -
imap_append: als gelesen markieren
Von Raven280438 im Forum PHPAntworten: 5Letzter Beitrag: 06.03.09, 09:39 -
Ungelesene Einträge aus db markieren...
Von Kalma im Forum PHPAntworten: 2Letzter Beitrag: 21.05.06, 14:42 -
php forum => Threads als gelesen markieren
Von Rpgrafx im Forum PHPAntworten: 11Letzter Beitrag: 07.12.05, 16:20 -
ungelesene Beiträge markieren
Von Ronny_25 im Forum PHPAntworten: 1Letzter Beitrag: 02.09.02, 13:15





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren