Topics gelezen/ongelezen
Ik ben voor een nieuwe site van me een forum in elkaar aan het scripten, maar nu weet ik niet hoe ik verder moet met het topics/fora gelezen/ongelezen gedeelte. Ik heb geprobeerd om in het userprofiel een row toe te voegen die "last_visited" heet en elke pagina geupdate wordt, en als deze lager is als het topic dat hij ongelezen is. Helaas werkt dit niet.
Dit was de code die ik heb gebruikt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$visitquery = mysql_query("SELECT last_visited FROM users WHERE username = '$_SESSION[username]'");
$visitdata = mysql_fetch_object($visitquery);
$gelezequery = mysql_query("SELECT * FROM forum_topics WHERE forumid = '$dataa->id' AND datum > '$visitdata->last_visited'");
$gelezedata = mysql_fetch_object($gelezequery);
if (mysql_num_rows($gelezequery) > 0) {
echo "<img alt='' src='images/folder_new.png'>";
} else {
if ($dataa->closed == 1) {
echo "<img alt='' src='images/folder_locked.png'>";
} else {
echo "<img alt='' src='images/folder.png'>";
}
}
?>
$visitquery = mysql_query("SELECT last_visited FROM users WHERE username = '$_SESSION[username]'");
$visitdata = mysql_fetch_object($visitquery);
$gelezequery = mysql_query("SELECT * FROM forum_topics WHERE forumid = '$dataa->id' AND datum > '$visitdata->last_visited'");
$gelezedata = mysql_fetch_object($gelezequery);
if (mysql_num_rows($gelezequery) > 0) {
echo "<img alt='' src='images/folder_new.png'>";
} else {
if ($dataa->closed == 1) {
echo "<img alt='' src='images/folder_locked.png'>";
} else {
echo "<img alt='' src='images/folder.png'>";
}
}
?>
Weet iemand hoe je dit kan maken?
Thanks ;)
Maak een tabel met id, topicid, userid, datetime. Dat is de eenvoudigste oplossing.
Views
topic_id | user_id | gelezen_op
En wanneer je heel veel topics en users verwacht:
Om te zorgen dat je straks geen enorme tabel krijgt kun je bijvoorbeeld zeggen dat alle topics die een maand oud zijn automatisch op "gelezen" worden ingesteld, en dan kun je met een cron-job de tabel opschonen. Gewoon de rijen weghalen waarbij "gelezen op" langer geleden is dan een maand.
Edit:
Wat arjan zei dus..
Wat arjan zei dus..
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
PHP Newbie schreef op 04.01.2008 16:56:
Om te zorgen dat je straks geen enorme tabel krijgt kun je bijvoorbeeld zeggen dat alle topics die een maand oud zijn automatisch op "gelezen" worden ingesteld, en dan kun je met een cron-job de tabel opschonen. Gewoon de rijen weghalen waarbij "gelezen op" langer geleden is dan een maand.
Bij phpbb is het zelf zo dat ie kijkt naar de laatste keer dat je ingelogt bent. Dus als je een hele tijd niet bent ingelogd zijn er een heleboel ongelezen topics, als je dan per ongeluk de browser afsluit, en weer opnieuw opstart, dan zijn alle topics gelezen :-).
Quote:
Om te zorgen dat je straks geen enorme tabel krijgt kun je bijvoorbeeld zeggen dat alle topics die een maand oud zijn automatisch op "gelezen" worden ingesteld
Hoe zou ik dat kunnen doen?
dat hoeft niet, mysql kan gerust om met tabellen van enkele GB's
Quote:
Wat is de definitie van enorm? Met 100 user en per user 100 gelezen topics per dag, krijg je 10.000 topics per dag, 3.650.000 topics per jaar (+ 10.000 voor een schrikkeljaar). Wanneer je alleen het userid, topicid en een datumtijd opslaat, is dat niet echt veel bijzonders, dat kan een beetje database echt wel aan. Mits je goede indexen gebruikt, dat dan wel weer.Om te zorgen dat je straks geen enorme tabel krijgt
Na ruim 1000 jaar kun je in de problemen komen, mocht je de id's als INT hebben opgeslagen, kun je maximaal 4.294.967.295 records opslaan. Een BIGINT brengt overigens uitkomst, dan kun je 18.446.744.073.709.551.615 records opslaan.
Een koppeltabel maken:
id | userid | topicid |readtime
Waarbij het userid het userid van een bezoeker is, het topicid het id van het topic en readtime een datetime stempel van wanneer het topic gelezen is.
Kan je ook controleren of er nieuwe reacties zijn in een topic.
Dat is al 2x gezegd. ;-)
Bedankt allemaal.
Nu wil ik ook dat de forumimages werken, de topic images heb ik zo gedaan:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
if ($_SESSION[username]) {
$visitquery = mysql_query("SELECT * FROM forum_read WHERE topicid = '$dataa->topicid' AND username = '$_SESSION[username]'");
$visitdata = mysql_fetch_object($visitquery);
$visit2query = mysql_query("SELECT * FROM forum_topics WHERE topicid = '$dataa->topicid' ORDER BY datum DESC LIMIT 1");
$visit2data = mysql_fetch_object($visit2query);
if ($visitdata->gelezen_op < $visit2data->datum) {
echo "<img alt='' src='images/topic_new.png'>";
} else {
if ($dataa->closed == 1) {
echo "<img alt='' src='images/topic_locked.png'>";
} else {
echo "<img alt='' src='images/topic.png'>";
}
}
} else {
echo "<img alt='' src='images/topic.png'>";
}
?>
if ($_SESSION[username]) {
$visitquery = mysql_query("SELECT * FROM forum_read WHERE topicid = '$dataa->topicid' AND username = '$_SESSION[username]'");
$visitdata = mysql_fetch_object($visitquery);
$visit2query = mysql_query("SELECT * FROM forum_topics WHERE topicid = '$dataa->topicid' ORDER BY datum DESC LIMIT 1");
$visit2data = mysql_fetch_object($visit2query);
if ($visitdata->gelezen_op < $visit2data->datum) {
echo "<img alt='' src='images/topic_new.png'>";
} else {
if ($dataa->closed == 1) {
echo "<img alt='' src='images/topic_locked.png'>";
} else {
echo "<img alt='' src='images/topic.png'>";
}
}
} else {
echo "<img alt='' src='images/topic.png'>";
}
?>
Ik heb ook al verschillende dingen geprobeert met de forum images maar het lukt niet :X
Gewijzigd op 01/01/1970 01:00:00 door Doney
Niemand?
Bumpen::
Je zou kunnen beginnen met de variabelen buiten quotes halen.
Gewijzigd op 01/01/1970 01:00:00 door Doney
Doney schreef op 05.01.2008 21:34:
Het werkt? Wat is dan het probleem? Waarom open je dan een topic of bump je een reeds opgelost topic?Wat maakt dat (die quotes) uit? Het werkt toch? En nu heb ik nog geen antwoord op mijn vraag..
pgFrank schreef op 04.01.2008 18:03:
Na ruim 1000 jaar kun je in de problemen komen, mocht je de id's als INT hebben opgeslagen, kun je maximaal 4.294.967.295 records opslaan. Een BIGINT brengt overigens uitkomst, dan kun je 18.446.744.073.709.551.615 records opslaan.
Quote:
Wat is de definitie van enorm? Met 100 user en per user 100 gelezen topics per dag, krijg je 10.000 topics per dag, 3.650.000 topics per jaar (+ 10.000 voor een schrikkeljaar). Wanneer je alleen het userid, topicid en een datumtijd opslaat, is dat niet echt veel bijzonders, dat kan een beetje database echt wel aan. Mits je goede indexen gebruikt, dat dan wel weer.Om te zorgen dat je straks geen enorme tabel krijgt
Na ruim 1000 jaar kun je in de problemen komen, mocht je de id's als INT hebben opgeslagen, kun je maximaal 4.294.967.295 records opslaan. Een BIGINT brengt overigens uitkomst, dan kun je 18.446.744.073.709.551.615 records opslaan.
Het opslaan is geen probleem, het gaat om het zoeken. Als die 100 users per dag bij ieder bezoek aan een forum pagina de complete tabel van 3.650.000 door moet laten zoeken, gaat dat zeker tenkoste van de peformace.
pgFrank schreef op 05.01.2008 21:44:
Doney schreef op 05.01.2008 21:34:
Het werkt? Wat is dan het probleem? Waarom open je dan een topic of bump je een reeds opgelost topic?Wat maakt dat (die quotes) uit? Het werkt toch? En nu heb ik nog geen antwoord op mijn vraag..
Ik bedoel dat een query met quotes net zo goed werkt als zonder ;-)
Weet er nu iemand hoe ik dit forumimage probleem oplos?
Dus $_SESSION[username] zou alleen kunnen als je hier de constante username gedefinieerd hebt, maar ik ga er niet van uit want dit zou zeer ongebruikelijk zijn.
Dus begin eens met $_SESSION['username'] te gebruiken en zet een error_reporting(E_ALL) bovenaan je script.
EDIT:
Waar is trouwens je mysql foutafhandeling???
Nooit simpelweg zo:
Maar altijd zo:
Code (php)
1
2
3
4
2
3
4
<?php
$query = ".....";
$result = mysql_query($query) or trigger_error(mysql_error());
?>
$query = ".....";
$result = mysql_query($query) or trigger_error(mysql_error());
?>
Maar, met de juiste indexen kun je de boel flink versnellen! Zet een index op het userid en eventueel een index op de datum, dan zal het zoeken al een stuk beter gaan.