Kleine Vragen Topic #1

Gestart doorLennard4.284 reacties15.585 weergaven

4.285 berichten · pagina 170 van 286

Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Hoe kan ik het beste een ongelezen berichten systeem maken op een forum?
0
Lennard

Lid · Topicstarter

Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Lennard schreef:
Ok, mijn uitleg. Zeg alsjeblieft achteraf niet dat je t laat zitten. emo
Je moet je forum even heel abstract in je hoofd hebben. Je hebt dan een tweetal soorten gelezen / ongelezen situaties:

1. In het topicoverzicht ("in dit topic staat >= 1 post die je nog niet gezien hebt")
2. In het forumoverzicht ("in dit forum staat een topic met >= 1 post die je nog niet gezien hebt")

Dan moet je je definities gaan maken: Wanneer is een post ongelezen? Wanneer is een topic ongelezen? Wanneer is een forum ongelezen? Datzelfde voor de ongelezen dingen. Met zulke ingewikkelde dingen kom je er gewoonweg niet uit als je maar "˜ergens begint en wat aanmoddert.
De definities:

1. Wanneer is een post gelezen?
Een post is ongelezen als de datum en tijdstip van plaatsing hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
2. Wanneer is een topic ongelezen?
Een topic is ongelezen als de datum en tijdstip van de laatste post in het betreffende topic hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
3. Wanneer is een forum ongelezen?
Een forum is ongelezen als de datum en tijdstip van de laatste post in een topic in het betreffende forum hoger is dan de datum en tijdstip van je laatste bezoek aan het bijbehorende topic in dit forum.

Maar dan ben je er nog niet. Je wilt niet iedere gebruiker verplichten om álle topics door te kijken, dus je wilt nog een tweetal linkjes; "Markeer alle fora als gelezen" en "Markeer alle topics als gelezen".
Die moet je dan ook nog in je definities verwerken:

1. Wanneer is een post gelezen?
Een post is ongelezen als de datum en tijdstip van plaatsing hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
MAAR:
Een post is gelezen als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen", of als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle topics als gelezen".
2. Wanneer is een topic ongelezen?
Een topic is ongelezen als de datum en tijdstip van de laatste post in het betreffende topic hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
MAAR:
Een topic is gelezen als de datum en tijdstip van de plaatsing van de laatste post lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen", of als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle topics als gelezen".
3. Wanneer is een forum ongelezen?
Een forum is ongelezen als de datum en tijdstip van de laatste post in een topic in het betreffende forum hoger is dan de datum en tijdstip van je laatste bezoek aan het bijbehorende topic in dit forum.
MAAR:
Een forum is gelezen als de datum en tijdstip van de plaatsing van de laatste post lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen".

Ja, t klinkt makkelijker dan het is. emo
Dan ga je heel voorzichtig een database opzet maken.
In die opzet moeten onder andere deze gegevens zitten:
- forum_berichten_alles_gemarkeerd (bevat alle kliks op "Markeer alle topics als gelezen")
o id van de gebruiker
o datum + tijdstip van de klik
o id van het forum
- forum_forums_alles_gemarkeerd (bevat alle kliks op "Markeer alle fora als gelezen")
o id van de gebruiker
o datum + tijdstip van de klik
- forum_berichten_gelezen (bevat alle views van de topics)
o id van de gebruiker
o id van het topic
o datum + tijdstip van de klik

Je moet je script en database(opzet) dus zo maken, dat hij alle bovengenoemde data op kan slaan en ook daadwerkelijk opslaat.

Ja, je krijgt dan enorm veel data, maar dat maakt als je de goede indices (meervoud van "˜index) hebt, niet uit; ik heb dit forum met een paar miljoen testposts geteld, en het werkte nog steeds zonder noemenswaardige vertragingen.
Welke indices je moet hebben moet je zelf maar uitzoeken, ik ga niet alles voorkauwen. yummie
Dan maak je een drietal bestanden; index.php (overzicht van alle fora), forum.php (overzicht van alle topics in dat forum), topic.php (overzicht van alle posts in dat topic).

Dan begint het echte kutwerk pas.
We beginnen met index.php.

Allereerst ga je de datum + tijdstip van de laatste klik op "Markeer alle fora als gelezen" ophalen. Je kunt dat in je fora-ophaal-query stoppen, maar dan wordt het alleen maar onoverzichtelijker en ingewikkelder (nog ingewikkelder).
Als je dat hebt gedaan haal je ook de datum + tijdstip op van de laatste klik op "Markeer alle topics als gelezen".
Als een van beide tijdstippen groter is dan het tijdstip van de laatste post in het betreffende forum, dan is het forum sowieso ongelezen, anders weet je het nog niet (je kunt immers ook gewoon alle posts gelezen hebben).
Let wel op dat de datum en tijd van de klik op "Markeer alle topics als gelezen" verschilt per forum; je kunt in het ene forum wel op die link hebben geklikt, maar op de andere niet. Je moet dus een leuke array maken met het forum id en de timestamp van je klik erop.

Dan maak je een query om alle fora en de bijbehorende de laatste posts op te halen. Hier op one2xs is het nog ingewikkelder, omdat een forum ook weer in een categorie kunt zitten. Maargoed, je haalt dus je data uit vier tabellen:
1. je forumtabel met alle fora erin
2. je poststabel om de laatste post van dat forum op te halen
3. je ledentabel om de auteur van de laatste post op te halen
4. je topictabel om de titel van de laatste post op te halen

Dat doe je dan, en je maakt een mooi loopje om al die fora op te halen en te doorlopen.
Tijd voor een stukje pseudocode:

[COLOR= #0000BB]<?php
$fora_gelezen_gemarkeerd[/COLOR]   [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal laatste datum + tijd van "markeer alle fora als gelezen";[/COLOR]
[COLOR= #0000BB]$topics_gelezen_gemarkeerd[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal laatste datum + tijd van "markeer alle topics als gelezen";[/COLOR]

[URL="http://www.php.net/while"]while[/URL][COLOR= #007700]([/COLOR]alle forums doorlopen[COLOR= #007700])
{[/COLOR]
    
    [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] FALSE[COLOR= #007700];[/COLOR] [COLOR= #FF8000]// we gaan er vanuit dat elk forum ongelezen is, tenzij anders bevonden[/COLOR]
    
    [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$foruminfo[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]tijdstip_laatste_post[/COLOR][COLOR= #007700]] <[/COLOR] [COLOR= #0000BB]$fora_gelezen_gemarkeerd[/COLOR] [COLOR= #007700]||[/COLOR] [COLOR= #0000BB]$foruminfo[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]tijdstip_laatste_post[/COLOR][COLOR= #007700]] <[/COLOR] [COLOR= #0000BB]$topics_gelezen_gemarkeerd[/COLOR][COLOR= #007700])
    {[/COLOR]
        
        [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] TRUE[COLOR= #007700];
        
    }[/COLOR]
    [URL="http://www.php.net/else"]else[/URL] [COLOR= #FF8000]// er is nu niet op "markeer alle ... als gelezen" geklikt:[/COLOR]
    [COLOR= #007700]{[/COLOR]
        
        [COLOR= #0000BB]$topics_gelezen[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal alle topic ids op waavoor geldt dat de datum van de laatste post van dat topic groter is dan de datum van je laatste bezoek aan dat topic[/COLOR]
        
        [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/mysql_num_rows"]mysql_num_rows[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$topics_gelezen[/COLOR][COLOR= #007700]) ===[/COLOR] [COLOR= #0000BB]0[/COLOR][COLOR= #007700])[/COLOR]
            [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] TRUE[COLOR= #007700];[/COLOR] [COLOR= #FF8000]// er zijn 0 ongelezen topic ids; dus forum is gelezen[/COLOR]
        
    [COLOR= #007700]}
    
}[/COLOR]
?>
Dat was alweer index.php"¦
Dan forum.php.

Hier hebben we alleen de datum + tijdstip nodig van de klik op "markeer alle topics als gelezen" waarbij het forum id van die klik gelijk is aan het forum id van het forum waar je nu in zit zegmaar.
Die haal je dus ook op.
Merk trouwens wel op dat je alleen de grootste datum hiervan wilt. Als mensen 10 keer op die link klikken, wil je de datum + tijdstip van de laatste klik; geen enkele andere.
De rest hiervan is een stuk makkelijker dan index.php.
Je haalt nu weer alle topics op uit je topictabel en doorloopt die weer (met een while).
Tijdens dat doorlopen ga je er weer van uit dat elk topic ongelezen is, tenzij je anders hebt geconstateerd.
Een topic is namelijk gelezen als een van de volgende voorwaarden geldt:
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle fora als gelezen"
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle topics als gelezen" voor dit betreffende forum
- De datum van de laatste post van dat topic is kleiner dan de datum van je laatste bezoek aan dit topic

In topic.php hoef je eigenlijk niets te doen; enkel een record opslaan dat het topic op dit moment is bekeken.

Als je het echt goed wilt doen sla je enkel de laatste post op die is bekeken (sommige bezoekers bezoeken enkel pagina 1 van een topic, terwijl het topic bijvoorbeeld 10 paginas heeft). Je gaat dan niet met datums vergelijken, maar met post ids. Je kunt dan ook een icoontje voor een post zetten om te laten blijken dat die gelezen danwel ongelezen is. Net als bij phpBB zegmaar. Je kunt een gebruiker dan ook direct doorsturen naar zijn laatst gelezen post. Maarja, dan wordt het weer een stuk moeilijker.

Anyway, dit is in grote (geloof me, hele grote cry) lijnen wat je moet doen.

Als je niet zo ervaren bent met PHP en MySQL dan raad ik je het echt serieus af. Het is leuk om het eens te proberen dan, maar baal niet te hard als het je niet lukt.

Je krijgt echt enorm lange queries die uit enorm veel verschillende tabellen data halen, dus de kans dat er "ergens" een fout zit is enorm groot. Dan moet je je hoofd koel houden en die fout die "ergens" zit, zien te ontdekken en op te lossen.
Zoals Ruben al zei; ik heb er vreselijk lang over gedaan om het 100 % werkend te krijgen, dus het is sowieso niet iets wat je in een vrij avondje effies in elkaar zet.

Ik heb dit hele verhaal in een word documentje zitten typen, dus als je liever een overzichtelijkere PDF hebt dan zeg je t maar.

Succes ermee. emo
Lennard.

Heb m nu niet doorgeelzen, dus geen idee of ik nog steeds achter die werkwijze sta en of het niet handiger kan (het forumsysteem hier heb ik al een paar keer veranderd), maar deze methode werkt iig.
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Jezus christus redface
ik ga die ff bookmarken redface Thx anyway!
0
Berichten
11.263
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hoe zorg ik dat mijn site extra lang moet laden?
Zo kan ik mijn laadpagina testen yummie
0
Lennard

Lid · Topicstarter

Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
sleep(10);emo
0
Berichten
11.263
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Lennard schreef:
sleep(10);emo
In javascript of;..?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Sanderc schreef:
Eerdere citaten tonen
Lennard schreef:
sleep(10);
emo
In javascript of;..?
javascript: while(true){}
0
Berichten
10.421
Reputatie
4
Punten
0,00
Lid sinds
Laatst gezien
Interessante bloemlezing over het markeren als gelezen. Voor de simpele zielen is er ook een :visited pseudo-element in CSS yummie
het is niet uitgebreid, maar het kan wel emo
Ikzelf zou eerder met inlogsessies werken, en alles tonen na je laatste inlogsessie is geplaatst. Niet efficient, maar i.c.m. de :visited redelijk effectief, lijkt me zo.
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Aarclay schreef:
Interessante bloemlezing over het markeren als gelezen. Voor de simpele zielen is er ook een :visited pseudo-element in CSS yummie
het is niet uitgebreid, maar het kan wel emo
Ikzelf zou eerder met inlogsessies werken, en alles tonen na je laatste inlogsessie is geplaatst. Niet efficient, maar i.c.m. de :visited redelijk effectief, lijkt me zo.
Opzicht zou die psuedo-element wel makkelijk zijn, maar dan werk ik toch liever met PHP yummie
0
Berichten
7.681
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik heb een query met 2joins, met de tabellen:
Film (informatie over een film)
film_genre (connect de film met de genre als er bijvoorbeeld meerdere genres bij een film zijn)
genre (waar de verschillende genres in staan)

Alleen als de film bijvoorbeeld 3genres heeft dan komt de film 3x in de lijst met de genre appart.
Hoe kan ik er voor zorgen dat de film maar 1x in de lijst staat en dan de genres naast elkaar gescheiden met een komma oid??

Query:

[COLOR= #0000BB]<?php
$query[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"SELECT 
                                    * 
                                FROM 
                                    film as f
                                LEFT JOIN 
                                    film_genre  as fg
                                ON 
                                    fg.film_id = f.id 
                                LEFT JOIN 
                                    genre as g
                                ON 
                                    fg.genre_id = g.id
                                LIMIT
                                    "[/COLOR][COLOR= #007700].[/COLOR][URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$results[/COLOR][COLOR= #007700]).[/COLOR][COLOR= #DD0000]"
                                "[/COLOR][COLOR= #007700]);[/COLOR]
0
Jvdw

Lid

Berichten
4.321
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Sanderc schreef:
Eerdere citaten tonen
Lennard schreef:
sleep(10);
emo
In javascript of;..?
[COLOR= #0000BB]<?php[/COLOR]

[COLOR= #FF8000]// current time[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [URL="http://www.php.net/date"]date[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]h:i:s[/COLOR][COLOR= #007700]) .[/COLOR] [COLOR= #DD0000]"n"[/COLOR][COLOR= #007700];[/COLOR]

[COLOR= #FF8000]// sleep for 10 seconds[/COLOR]
[URL="http://www.php.net/sleep"]sleep[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]10[/COLOR][COLOR= #007700]);[/COLOR]

[COLOR= #FF8000]// wake up ![/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [URL="http://www.php.net/date"]date[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]h:i:s[/COLOR][COLOR= #007700]) .[/COLOR] [COLOR= #DD0000]"n"[/COLOR][COLOR= #007700];[/COLOR]

?>


toevoeging op 9 november 2012, 221223:
weet iemand trouwens waarom hij #hoi niet hide?

$(#hoi).click(function () {
$("#stats").slideDown("slow");
$("#hoi").hide();
});
0
Lennard

Lid · Topicstarter

Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
omdat je een quote achter #hoi hebt
0
Jvdw

Lid

Berichten
4.321
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Lennard schreef:
omdat je een quote achter #hoi hebt
dit is het nadeel van het jeugdhuis cry Wat een fail vanmij emo
0
Berichten
11.263
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hallo,

ik heb nu dit:

[COLOR= #0000BB]<?php
$ref[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]HTTP_REFERER[/COLOR][COLOR= #007700]];[/COLOR]

[URL="http://www.php.net/if"]if[/URL] [COLOR= #007700]([/COLOR][COLOR= #0000BB]$ref[/COLOR] [COLOR= #007700]!=[/COLOR] [COLOR= #DD0000]"http://www.google.com"[/COLOR][COLOR= #007700]){[/COLOR]
    
    [URL="http://www.php.net/exit"]exit[/URL][COLOR= #007700];
}[/COLOR]
[URL="http://www.php.net/else"]else[/URL]
[COLOR= #007700]{[/COLOR]
?>

//content
[COLOR= #0000BB]<?php[/COLOR]
[COLOR= #007700]}[/COLOR]
?>


Maar dus bij content staat al mijn HTML content etc. maar zo lukt het niet, en echoen is ook niet evident. HOe zouden jullie dit doen?

toevoeging op 10 november 2012, 131421:
VRAAG 2

Waarom doe dit het niet?

<input class="button" type="submit" name="login" value=" " onClick="window.location=http://google.com">


@http://sander.vanmarijn.nl
0
Berichten
9.953
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hoe kan ik het beste een simpele template parser maken? Ik heb dus zegmaar .tpl files met daarin dingen als {titel}, en dat wil ik weergeven.
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren