[PHP/postgresql] Forum maken - new posts

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Heya
Ik heb heel veel gezocht op GoT en google, maar ik kan mn antwoord niet vinden.
Ik hoop dat jullie me kunnen helpen :)
Ik ben bezig met een forum te maken. Het forum is af, maar nu moet de 'new posts' optie erbij.
Mijn vraag is hoe ik dit het beste kan aanpakken.

Hoe hou jij bij welke topics een user al gelezen heeft, en welke niet?
Is het standaard ongelezen, en hou je in een apparte tabel bij welke topics door welke user op welk tijdstip gelezen zijn? En met het opbouwen van de topic-lijst, moet je dan per rij/topic van de laatste reply de datum vergelijken met die in die speciale tabel?

En hoe mark je alle topics tot gelezen als je het via deze manier doet?

Ik heb het nu op die manier gedaan, alleen vraag ik me af in hoeverre dit kost qua performance:
Bij elke rij/topic doe ik:
PHP:
1
2
3
4
if (pg_query($dbconn, "SELECT * FROM forum_readed_posts 
        WHERE user_id = $user_id 
        AND topic_id = ". $row["topic_id"]. "  
        AND date >= ". $row["date_added"]. " LIMIT 1"))

En hoe ik alle topics dus kan markeren als gelezen.

Bij voorbaat dank voor jullie hulp!

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Tweakers.net gebruikt volgens mij koekjes.
Als ik thuis kom is al het gelezen weer rood...

Je kunt de inhoud van een gevulde koek makkelijk laten inkrimpen als je een maximale waarde instelt hoe lang een topic als ongelezen wordt aangegeven.

:Y)

[ Voor 10% gewijzigd door RwD op 21-07-2004 13:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

XLerator schreef op 21 juli 2004 @ 12:42:
Hoe hou jij bij welke topics een user al gelezen heeft, en welke niet?
Is het standaard ongelezen, en hou je in een apparte tabel bij welke topics door welke user op welk tijdstip gelezen zijn? En met het opbouwen van de topic-lijst, moet je dan per rij/topic van de laatste reply de datum vergelijken met die in die speciale tabel?
Is het een idee om alle threads als standaard gelezen te markeren? En per gebruiker een lijst bij te houden van nog te lezen threads? Het hangt natuurlijk af van waar het forum over gaat, maar ik ga er hier van uit dat de gebruiker meer threads wel dan niet heeft gelezen. Deze strategie bespaart wat ruimte in je SQL-database.

Ik gooi ook maar even een balletje op.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Het wordt geen mega groot forum :) Dus ik denk dat je gelijk hebt dat de meeste mensen de meeste threads gelezen zullen hebben.
Maar nog een (performance) vraag: Hoe kijk je in de topic lijst in welke topics je al gereageerd hebt? Moet je dan bij elke topic SELECT * WHERE user_id = JOUW_ID ? Dat lijkt me nogal zwaar

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Nogmaals, waarom een database manier?
Je kunt ook met cookies doen, ik heb je al een voorbeeld gegeven van een grote site die het doet.

Hou daar inderdaad bij welke gelezen zijn, en verwijder gelezen threads als ze belegen zijn uit het cookie...

Van de andere kant, ik kom nog steeds enorm veel problemen tegen als ik cookies vereis :S maar dat is een andere zaak :p

[ Voor 20% gewijzigd door RwD op 21-07-2004 14:10 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Nee ik wil het niet met cookies doen:
1. de mensen moeten het aan hebben staan
2. maar vooral omdat het achter elke PC gelijk moet zijn
En met cookies is het ook weg na een bepaalde tijd. Al met al wil ik geen cookies :)
Toch bedankt voor de tip :)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

XLerator schreef op 21 juli 2004 @ 13:19:
Maar nog een (performance) vraag: Hoe kijk je in de topic lijst in welke topics je al gereageerd hebt? Moet je dan bij elke topic SELECT * WHERE user_id = JOUW_ID ? Dat lijkt me nogal zwaar
Andere vraag: Is het wenselijk om in de lijst met topics te zien of je er al op hebt gereageerd? Bij een forum wil je meestal vaker dan eens reageren op een topic (reageren op andermans reacties op jouw reacties). Wat misschien wel klantvriendelijk is, is om aan te geven of de meest recente reactie in de topic van jezelf is. Al is het maar een "last post by:".

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

XLerator schreef op 21 juli 2004 @ 14:13:
Nee ik wil het niet met cookies doen:
1. de mensen moeten het aan hebben staan
2. maar vooral omdat het achter elke PC gelijk moet zijn
En met cookies is het ook weg na een bepaalde tijd. Al met al wil ik geen cookies :)
Toch bedankt voor de tip :)
Is het geen optie om in de code van phpBB te duiken, en te kijken hoe zij het doen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
@NMe84: Ik heb wel de code van PHPNuke, maar die zit zo ontiegelijk de allenogwat uitgebreid, anders en overdreven professioneel in elkaar, daar heb ik helemaal niets aan.
Is phpBB minder erg?

@Doodle_Jack: Ja het is de wens van de opdrachtgever ;) En ik vind het zelf altijd erg prettig, dus ik geef ze gelijk. Wat jij zegt kan ook, maar zowel de opdrachtgever als ik hebben liever dat je het altijd ziet :)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

XLerator schreef op 21 juli 2004 @ 14:23:
@Doodle_Jack: Ja het is de wens van de opdrachtgever ;) En ik vind het zelf altijd erg prettig, dus ik geef ze gelijk. Wat jij zegt kan ook, maar zowel de opdrachtgever als ik hebben liever dat je het altijd ziet :)
Dan lijkt mij SELECT * WHERE user_id = JOUW_ID inderdaad de beste oplossing.

Acties:
  • 0 Henk 'm!

Verwijderd

Wat ik heb gedaan in een forum wat ik heb gemaakt, is de datum dat je de laatste keer op het forum bent geweest opslaan. Alle threads die dan een post hebben die nà je laatste bezoekdatum is zijn nieuw.

In de session wordt bijgehouden welke threads je tijdens de huidige sessie al hebt bekeken; deze worden ook aangegeven als reeds gelezen.

Dit is een hele efficiënte oplossing, met als enige nadeel dat als je je browser sluit, dan automatisch alle threads als "gelezen" gelden. Ik vind dit zelf perfect acceptabel, maar ik krijg er nogal eens gezeur over van mijn gebruikers.

Een ander uiterste is dat je alle threads persé moet lezen; dit heb ik op een ander forum gezien. Sommige threads _wil_ ik niet lezen (en er zijn er trouwens honderden van in het verleden), maar ze blijven altijd en immer als "ongelezen" gemarkeerd. Op elk forum staat altijd dat er "ongelezen posts" zijn, terwijl me die helemaal niet interesseren. Zeer irritant, en het lampje is nutteloos.

Acties:
  • 0 Henk 'm!

Verwijderd

Als je van erg brakke code houdt, dan is dat zeker een goed idee.

Mij lijkt het het makkelijkste om van elk forum (en niet van elke post) bij te houden wanneer je het het laatst bezocht. Als er dan nieuwe posts bijkomen in een topic ( $posttime > $lastread ) dan staan er dus sowieso ongelezen posts in.

Eventueel kan je ook nog gaan bijhouden in welke threads je al gepost hebt en dan ook nog eens controleren of er in die thread nog gepost na jij erin gepost hebt.

En tsja, als je echt per sé per thread 100% accuraat wil bijhouden of er nieuwe posts zijn dan vrees ik dat je geen andere optie hebt dan een gigantische tabel aan te maken waarin per user staat wanneer ie welke threads bekeken heeft.

OneOfBorg was me met twee seconden voor

[ Voor 5% gewijzigd door Verwijderd op 21-07-2004 14:30 . Reden: OneOfBorg was me met twee seconden voor ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
@OneOfBorg: Je hebt altijd de knop "Remark all topics as read" ofzo, voor alles en per forum.
Dus dat minpuntje valt (iig voor ons) af :)
Jouw oplossing is opzich wel goed, maar ik weet dat ik me er ook aan erger dat alles ineens gelezen is. Dat wil ik niet :)

@vkgandalf: Wie zegt dat ik van brakke code hou :?
Mja, ik heb maar 1 forum, 1 laag dus. Meer hoefde ze niet. En per topic moet er dus worden bekeken
1: of er een nieuwere reply in staat sinds jij voor het laatst gekeken hebt in dat topic:
2: of jij er in gereplied hebt

Maar andere fora doen dit wel zoals ik wil. Oa het forum van onze school (CMD @ NHL)

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

XLerator schreef op 21 juli 2004 @ 14:34:
@OneOfBorg: Je hebt altijd de knop "Remark all topics as read" ofzo, voor alles en per forum.
Dus dat minpuntje valt (iig voor ons) af :)
Jah, maar dat forum waar ik het over had, heeft dat dus niet :X

Acties:
  • 0 Henk 'm!

Verwijderd

Als je niet al te veel gebruikers hebt kan je ook per thread (eventueel in een aparte tabel) bijhouden wie het topic al bekeken heeft of gereplied heeft. Iets zoals

ThreadID | UserIDs

en die userid's kan je dan scheiden door komma's oid en daarna met de functie explode() in een array dumpen en dan met in_array nagaan of jouw userid in die array voorkomt (indien ja heb je gereplied, anders niet).
En als je dan ook wil bijhouden of je de thread al bekenen hebt kan je het op dezelfde manier doen, maar telkens er een nieuwe reply in de thread komt maak je het UserIDs veld gewoon weer leeg.

Maar als je duizende gebruikers hebt zou ik het zeker en vast zo niet doen aangezien dat waarschijnlijk een beetje te traag zal worden.

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Verwijderd schreef op 21 juli 2004 @ 14:41:
Als je niet al te veel gebruikers hebt kan je ook per thread (eventueel in een aparte tabel) bijhouden wie het topic al bekeken heeft of gereplied heeft. Iets zoals

ThreadID | UserIDs

en die userid's kan je dan scheiden door komma's oid en daarna met de functie explode() in een array dumpen en dan met in_array nagaan of jouw userid in die array voorkomt (indien ja heb je gereplied, anders niet).
Is het dan niet simpeler om dan gewoon een select op userid te doen? Dan heb je namelijk gelijk een mooi lijstje van alle threads die je dus al gelezen hebt, ipv alle threads die iedereen gelezen hebben handmatig te vergelijken met de userid. B)

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Banpei schreef op 21 juli 2004 @ 17:41:
[...]

Is het dan niet simpeler om dan gewoon een select op userid te doen? Dan heb je namelijk gelijk een mooi lijstje van alle threads die je dus al gelezen hebt, ipv alle threads die iedereen gelezen hebben handmatig te vergelijken met de userid. B)
Ik denk dat het aannemelijk is dat er meer threads zullen zijn dan users. Dus lijkt een groot aantal velden met elk een relatief klein aantal waarden me beter dan een klein aantal velden met duizenden waarden.
En als je het op jouw manier doet en er post iemand iets nieuw in een thread wordt het heel wat ingewikkelder om aan te duiden welke gebruikers die thread al gelezen hebben, want dan moet je alle velden van alle users gaan parsen en daar dan die ene thread uithalen, terwijl je op mijn manier gewoon het veld kan leegmaken.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij kun je de oplossing van RwD ook zonder cookies doen. Je zou bijvoorbeeld een tabel "cookie" kunnen maken met daarin de gegevens die je anders in een cookie zou opslaan en een gebruikersid. Als je dan vervolgens nog standaard alles van [vul hier een arbitraire grootte en tijdseenheid in] of ouder als gelezen beschouwd, heb je toch wat je wil? En dan werkt het ook nog beter dan phpbb die volgens mij ook met cookies werkt.
Pagina: 1