tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
517
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    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
     

  2. #2
    Avatar von therealcharlie
    therealcharlie therealcharlie ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Beiträge
    200
    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.
     

  3. #3
    KristophS KristophS ist offline Mitglied Brilliant
    Registriert seit
    Apr 2004
    Ort
    Duisburg
    Beiträge
    778
    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-Code:
     if($_COOKIE['read'] != 1){
     echo <
    img src=ungelesen.gif>
    }else{
     echo <
    img src=read.gif>

    Hoffe du kannst meinen Ansatz nachvollzeihen.
     

  4. #4
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    @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.
     

  5. #5
    Zatic Zatic ist offline Mitglied Gold
    Registriert seit
    Dec 2002
    Beiträge
    131
    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.
     

  6. #6
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    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.
     

  7. #7
    KoMtuR KoMtuR ist offline Mitglied Brokat
    Registriert seit
    Apr 2002
    Ort
    Chemnitz
    Beiträge
    440
    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-Code:
    $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-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); 
    Diese Sachen schreibt ihr nun in die Tabelle "post_check":
    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"); 
    Wenn ihr nun in irgendein Forum rein geht, dann liest er diesen Datensatz aus und überprüft die Variable $last_visit:
    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

    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.

    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-Code:
    $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
    Geändert von KoMtuR (27.06.04 um 18:16 Uhr)
     

  8. #8
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    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
     

  9. #9
    KoMtuR KoMtuR ist offline Mitglied Brokat
    Registriert seit
    Apr 2002
    Ort
    Chemnitz
    Beiträge
    440
    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)
     

  10. #10
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    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.
     

  11. #11
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    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
    Mach ich doch gerne. 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:
    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, 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!
     

  12. #12
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    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
     

  13. #13
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    Was funktioniert denn genau nicht? Folgender Code funktioniert bei mir prima (Anzeige der einzelnen Array-Elemente):
    PHP-Code:
    $text "1&5&4&33&23&6";
    $array explode("&",$text);
    foreach (
    $array as $id) {
    echo 
    $id " ";

    Das hier funktioniert auch:
    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!";

    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";
    $id 2;
    $text $text "&" $id;
    echo 
    $text
    bzw. das:
    PHP-Code:
    $text "1&5&4&33&23&6";
    $id 2;
    $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.
     

  14. #14
    sonicks sonicks ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    213
    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 snx
    Geändert von sonicks (05.07.04 um 15:35 Uhr)
     

  15. #15
    Avatar von Ben Ben
    Ben Ben Ben Ben ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Raum FFM
    Beiträge
    1.364
    ...aber verstösst gegen die 1. NS
     

Ähnliche Themen

  1. Nachricht öffnen und als gelesen markieren
    Von thehasso im Forum Javascript & Ajax
    Antworten: 11
    Letzter Beitrag: 04.05.09, 18:14
  2. imap_append: als gelesen markieren
    Von Raven280438 im Forum PHP
    Antworten: 5
    Letzter Beitrag: 06.03.09, 09:39
  3. Antworten: 2
    Letzter Beitrag: 21.05.06, 14:42
  4. Antworten: 11
    Letzter Beitrag: 07.12.05, 16:20
  5. ungelesene Beiträge markieren
    Von Ronny_25 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 02.09.02, 13:15