ThWboard Support-Forum (Archiv)

Ort: / Boardübersicht / Code Hack Requests / Link "neue Beiträge seit letztem Besuch"


<< vorherige Seite – Seite 2 von 3 – nächste Seite >>

theDon schrieb am 13.08.2003 um 14:49 Uhr

Dr.HDi postete
@theDon:

Natürlich muss das Update pro User erfolgen.

If you recall:

CREATE TABLE `tb_lastvisited` (
  `boardid` int(10) unsigned NOT NULL default '0',
  `userid` int(10) unsigned NOT NULL default '0',
  `lastvisitedtime` int(10) unsigned NOT NULL default '0',
  KEY `useridboardid` (`userid`,`boardid`)
) TYPE=MyISAM;

Primärschlüssel userid, boardid !!! Die Einträge werden pro User geführt.

Also ein Loop über alle user, die seit 5 min. nix gemacht haben und (vgl. misc.php)

nein. foo hat seit 5 mins nichts gemacht, kriegt aber trotzdem den post von bar nicht mit. ._°

Dr.HDi schrieb am 13.08.2003 um 15:26 Uhr

Aber doch: Wenn in tb_lastvisited für foo in der Spalte "lastvistedtime" der Wert "onlinetime" aus tb_online des Users foo genommen wird !

Ich überlege aber gerade, ob man die "Beiträge seit letzem Besuch" nicht generell über "onlinetime" aus tb_online statt tb_lastvisited suchen sollte. Schließlich wird tb_online ständig pro User aktualisiert.

What ya think about it ?

theDon schrieb am 13.08.2003 um 16:24 Uhr

ehm, lastvisited wird auch ständig pro user aktualisiert. ._°

Dr.HDi schrieb am 13.08.2003 um 20:12 Uhr

* tb_lastvisited wird nur aktualisiert, wenn man [ Alle Boards als gelesen markieren ] anklickt (misc.php) oder ein Board ansieht (board.php bzw. include header.inc.php).
* tb_online wird immer über den include header.inc.php aktualisiert.

Ich werde wenn ich Zeit habe, ein Perl-Skript schreiben, was genau folgendes tut:

1) Suche alle User über tb_online, die seit 5 min. (oder mehr) nichts mehr gemacht haben
2) Setze bei diesen Usern tb_lastvisited.lastvisitedtime = tb_online.onlinetime wo tb_lastvisited.lastvisitedtime != tb_online.onlinetime

Weiteres dann, wenn's funzt.

theDon schrieb am 14.08.2003 um 00:32 Uhr

und ich sage dir, dein script wird nicht das tun, was es soll. wenn ein user postet, dann ist lastvisitedtime = posttime. wenn jetzt 2 minuten später ein anderer user im selben board postet, dann ist der ungelesen. 3 minuten später setzt dein script, wenn der user dann nichts mehr gemacht hat, die lastvisitedtime hoch und schon ist der post gelesen. ._°

Dr.HDi schrieb am 14.08.2003 um 09:13 Uhr

Genau das wird das Skript NICHT tun.

foo verläßt das Board (tb_online.onlinetime = 12:00:00)
bar postet etwas (tb_post.posttime = 12:02:00)
bert postet auch etwas (tb_post.posttime = 12:04:00)
tux postet (tb_post.posttime = 12:05:00)

Das Skript läuft und setzt für foo tb_lastvisited.lastvisitedtime = 12:00:00 (letzter Eintrag für foo in tb_online) für alle Boards.

foo betritt wieder das Board (13:15:00)
foo ruft die Funktion [ Beiträge seit letztem Besuch ] auf und sieht die Beträge von
* bar
* bert und
* tux

Was soll da nicht funktionieren ?

serotonic schrieb am 14.08.2003 um 09:25 Uhr

Da gibt es aber auch das Problem, dass nicht jeder das Board verlässt, wenn er aufhört zu lesen...

Also foo ist auf dem Board aber liest nicht mit,
bar postet was,
foo verlässt das Board, ohne sich den neuen Eintrag anzusehen...

Dr.HDi schrieb am 14.08.2003 um 09:57 Uhr

tb_online.onlinetime wird bei einem angemeldeten Benutzer bei jedem Seitenaufruf aktualisiert ! Wenn Du also einfach auf eine andere Webseite wechselst, dann steht in tb_online.onlinetime die Zeit des letzten Seitenaufrufes drin. Abmelden ist nicht notwendig.

Also foo ist auf dem Board aber liest nicht mit, (t1)
bar postet was, (t2)
foo verlässt das Board, ohne sich den neuen Eintrag anzusehen... (t3)

tb_online.onlinetime steht auf (t1). Beim nächsten Aufruf von [ Beiträge seit letztem Besuch ] durch foo wäre der Betrag von bar (t2) also sichtbar.

Für den Fall des Abmeldens sind noch "Koppgedanken" nötig ...

serotonic schrieb am 14.08.2003 um 10:50 Uhr

Alles klar, Denkfehler!

theDon schrieb am 14.08.2003 um 12:04 Uhr

[12:00:00] foo postet -> lastvisitedtime
[12:01:00] bar postet
[12:02:00] foo guckt sich, warum auch immer, die memberlist an, verlässt danach die seite -> lastonline
[12:07:00] dein skript setzt lastvisitedtime = lastonline -> bars eintrag ist gelesen.

._°

Dr.HDi schrieb am 14.08.2003 um 14:01 Uhr

[12:07:00] dein skript setzt lastvisitedtime = lastonline -> bars eintrag ist gelesen.

Wir reden jetzt aneinander vorbei !

Thema dieses Threads ist Link "neue Beiträge seit letztem Besuch" und nicht Link "alle Threads, die ich noch nicht gelesen habe" !

Für die Themenstellung [ Beiträge seit letztem Besuch ] würde es funzen. Alles andere würde einen riesigen Overhead wie in anderen Boards erzeugen, da man dann pro User speichern müßte, ob der User dieses Thema gelesen hat und wann. Was dann mit steigender Zahl User passieren würde ist klar ...

theDon schrieb am 14.08.2003 um 15:18 Uhr

ehem. der beitrag wird dann in board.php als gelesen gekennzeichnet

hevtig schrieb am 05.02.2004 um 20:23 Uhr

Hmm, Thema ist schon ein wenig her, aber immer noch interessant...

der hier gepostete Hack funzt net bei mir :/

naja, wie wäre es denn mit dem Lösungsansatz:

lastvisit-sessioncookie_zeit

Da gibts doch so´ne Zeit indem das Sessioncookie ungültig wird. Ah ja ich seh grade "Sessiontimeout", also da könnte man doch ansetzen.

Zeit der letzten Aktion - Sessiontimeout . Wenn man sich dann erneut einloggt erscheinen alle neuen als ungelesen, oder nicht? Dann kann es höchstens passieren, das man seine eigenen Posts noch sieht und welche die man schon gelesen hat...

Was haltet ihr davon.?

Gruss

HeVTiG

Criss schrieb am 05.02.2004 um 21:52 Uhr

Hallo HeVTiG,

der Hack funktioniert mit ein paar kleinen Anpassungen. Hier die Anleitung:

in der search.php

von

elseif( $searchfor == "lastthreads" )
    {
        $where[] = "(thread.threadtime)>" . (time() - (60 * 60 * 24 * intval($days)));
    }

nach

elseif( $searchfor == "lastthreads" )
    {
        $where[] = "(thread.threadtime)>" . (time() - (60 * 60 * 24 * intval($days)));
    }
elseif( $searchfor == "lastvisit" )
    {
                if( $g_user['userid'] <= 0 )
                {
            message("Fehler", "Sie müssen angemeldet sein, um diese Funktion nutzen zu können.");
                }

        $r_lastvisit = thwb_query("SELECT MAX(lastvisitedtime) FROM ".$pref."lastvisited WHERE userid=".$g_user['userid']." O
RDER BY lastvisitedtime DESC");
        $lastvisit = mysql_fetch_array($r_lastvisit);

        $where[] = "(thread.threadtime)>(" . $lastvisit['MAX(lastvisitedtime)'] . ")";
    }

und in der main.html den Link wie folgt:

<A href="_('search.php?startsearch=1&searchfor=lastvisit')">Beiträge seit dem letzten Besuch anzeigen</A>

einfügen.

Viele Grüße
Criss

hevtig schrieb am 24.06.2004 um 12:16 Uhr

Hi Criss,

danke erstmal :)
ja, ok, ich habe mir etwas Zeit gelassen den zu installieren ;)

ich habe die 2.81 und habe den link in der main.html abgeändert, sodaß er funktioniert.
Ich bekomme leider folgende Fehlermeldung:

ThWboard ErrorMySQL: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ')
LIMIT 1000' at line 7
Query:
SELECT DISTINCT
thread.threadid AS hits
FROM
tb_thread AS thread,
tb_post AS post
WHERE
(post.threadid=thread.threadid) AND (thread.boardid IN (2,3,121,6,7,8,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,44,43,45,46,132,129,130,53,54,55,56,57,58,59,60,61,62,70,135,69,71,120,125,124,119,123,122,118,133,126,136,134,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,127,128,131,137,138,139)) AND (thread.threadtime)>()
LIMIT 1000

Was kann ich dort tun?

hevtig schrieb am 24.06.2004 um 12:21 Uhr

hmm, mit dem einen User gehts, mit nem anderen nicht...

PhoenixDH schrieb am 04.08.2004 um 18:34 Uhr

Wie sieht das mit der 2.84 aus, geht das auch mit der Beschreibung aus Post Nr. 38, oder besser gesagt sollte es gehen, denn ich hab es eingebaut und wenn ich draufklicke bekomme ich folgende Meldung:

ThWboard ErrorMySQL: You have an error in your SQL syntax near 'O
RDER BY lastvisitedtime DESC' at line 1
Query: SELECT MAX(lastvisitedtime) FROM tb_lastvisited WHERE userid=1 O
RDER BY lastvisitedtime DESC

Woran liegt das ?

hevtig schrieb am 04.08.2004 um 21:33 Uhr

Hmm, ich hatte das zuerst auch. Ich vermute, daß das an dem Umbruch bei O
RDER liegt.

Ansonsten hab ich die ältere Version genommen, damit ging es. @ 2.81
Oder nimm diesen Code aber vergleich mal den Query mit der alten Vesion. Der dürfte ansich Versionsunabhängig sein...

PhoenixDH schrieb am 05.08.2004 um 06:00 Uhr

Geht soweit, aber kann es sein das ein sql Fehler kommt wenn Leute den Button drücken auch wenn sie noch keinen Post haben ? War bei mir so !

hevtig schrieb am 10.08.2004 um 10:00 Uhr

ja, hatte ich auch. hier der fix: (@2.81)

search.php:
Nach der Zeile "$lastvisit = mysql_fetch_array($r_lastvisit);" (ca. Zeile 137) muss eingefügt werden:

        // "Beiträge seit letztem Besuch"-Hack
        if( $lastvisit['MAX(lastvisitedtime)'] <= 0 )
        {
                message("Keine Themen gefunden", "Es wurden keine Themen gefunden die Ihren Suchkriterien entsprechen!");
        }
        // "Beiträge seit letztem Besuch"-Hack end

damit sollte es gehen..

PhoenixDH schrieb am 04.10.2004 um 14:13 Uhr

Hab da noch was entdeckt, also der Hack geht soweit, nur ist es so:

Ich rufe das Forum auf und ich weiß das es neue Posts gibt, dann gehe ich auf "Beiträge seit letzem Besuch" und ich bekomme sie auch angezeigt.

Gehe ich aber in das FOrum, lese zuerst einen Thread und klicke danach auf den Link, bekomme ich in der SUche nichts angezeigt !

Ist das bei euch auch so ? Soll das so sein ? Hat es jemand anders ?

hevtig schrieb am 04.10.2004 um 14:32 Uhr

Hi PhoenixDH,

ja, der Hack ist genau so. Da gibt es also noch ne Menge zu verbessern.
Ist sogesehen ein Bug, aber mit dem Code ist es halt so.

Wenn du die board.php aufrufst (dir also ein Forum anschaust) wird ein timestamp gesetzt. der Link "Beiträge seit letztem Besuch" sucht Beiträge von "JETZT" bis "TIMESTAMP".

Also hast du evtl. nur 1 Mal eine Auflistung, welche Threads neu sind, da beim nächsten Klick alles weg sein könnte.

Genauso läuft es auch auf andere Seite falsch..
wenn du beiträge seit letztem Besuch klickst und die Beiträge in einem neuen Fenster öffnest und nichts weiter machst, dann wird kein Timestamp gesetzt und du hast beim nächstem Mal die alten Beiträge wieder dabei.

Ein Update wäre sicherlich schön ;) Evtl muß man da wieder mit einer temporären tabelle arbeiten??? Vielleicht setz ich mich mal dran, aber im Mom wirklich überhaupt keine Zeit und dann kommt bei mir erstmal noch der Attachmenthack ;)

PhoenixDH schrieb am 04.10.2004 um 15:02 Uhr

Wäre net schlecht wenn das jemand überarbeitet.

Ich fände es am besten wenn der Link im gleichen Fenster geöffnet wird, der Timestamp aber erst gesetzt wird, wenn der Beitrag auch gelesen wurde. Somit hat man nämlich erst eine Übersicht was für einen neu ist.

hevtig schrieb am 04.10.2004 um 15:06 Uhr

PhoenixDH postete
Wäre net schlecht wenn das jemand überarbeitet.

Ich fände es am besten wenn der Link im gleichen Fenster geöffnet wird, der Timestamp aber erst gesetzt wird, wenn der Beitrag auch gelesen wurde. Somit hat man nämlich erst eine Übersicht was für einen neu ist.

hmm, das ist dann schon wieder was völlig anderes. Siehe Diskussion am Anfang dieses threads.
Es ist was anderes, zu sagen "zeige mir die Beiträge seit letztem Besuch" als "zeige mir alle von mir noch nicht gelesenen Beiträge"

PhoenixDH schrieb am 04.10.2004 um 15:22 Uhr

Hast auch wieder Recht.

Aber wenn man das so sieht würde der Hack das ja jetzt schon erfüllen, wenn das von mir nicht gewünscht ist.

<< vorherige Seite – Seite 2 von 3 – nächste Seite >>