Nepřečtené příspěvky ve fóru – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nepřečtené příspěvky ve fóru – PHP – Fórum – Programujte.comNepřečtené příspěvky ve fóru – PHP – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
wise0
Stálý člen
8. 4. 2009   #1
-
0
-

Jak nejlépe řešit tento problém pro všechny uživatele na webu? Napadlo mě si pro každou diskusi uložit pro daného uživatele tabulku, ale diskuse přibívají i uživatelé. Takže přidávat tabulky. Ale pokavaď uživatelů bude např. 1000, diskusí taky, je to 1000x1000 tabulek a to už může být db trošičku zpomalená. Jak byste tento problém řešili vy?

Nahlásit jako SPAM
IP: 89.176.199.–
"Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód..."
Reklama
Reklama
Mixxy
~ Anonymní uživatel
179 příspěvků
8. 4. 2009   #2
-
0
-

A co tak si nadefinovat v css jinou barvu pro prectene odkazy?? ;)

Nahlásit jako SPAM
IP: 88.101.208.–
wise0
Stálý člen
8. 4. 2009   #3
-
0
-

O tohle mi nejde, jak to zobrazit. Jde o to, jak u každého uživatele ukázat co on má nepřečtený.

Můžu udělat např. sloupeček stav, kde bude např. hodnota 0, 1, přečtený, nepřečtený. Ale když přijde jeden uživatel, klikne na to a nastaví se to na přečteno :) a u druhého bude taky přečteno, ikdyž on o tom nemá tušáka.. Si mě nepochopil, jak sem to myslel.

Nahlásit jako SPAM
IP: 89.176.199.–
"Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód..."
Curo
~ Šéfredaktor
+8
Hero
8. 4. 2009   #4
-
0
-

To wise : Musíš udělat speciálně pro toto tabulku, kde budeš zaznamenávat u každého přihlášeného uživatele, zda-li dané vlákno / příspěvky (případně kolik) přečetl.

Tabulka by mohla vypadat takto:
id ctenar frumid frum_vl frum_pst datum

ID - auto increment ID
ctenar - ID ctenáře
frumid - ID diskuze (PHP...)
frum_vl - ID vlákna (Jak instalovat Apache...)
frum_pst - počet příspěvků, když to naposledy navštívil (5...)
datum - datum posl. návštěvy (DATE-TIME, doplňující, nepovinné)

Při každé návštěvě vlákna (tedy při čtení příspěvků) se aktualizuje na konci (tj. po vypsání příspěvků, na konci skriptu) počet příspěvků (frum_pst), díky počtu zjistíš, kolik nových je od posl. návštěvy (rozdíl počet příspěvků ve vláknu a počet ve frum_pst), stejně tak zjistíš, zda-li toto vlákno už navštívil (bude v DB existovat záznam pro daného uživatele a dané vlákno).

Nahlásit jako SPAM
IP: 83.240.25.–
Guitar Hero Master, Project führer & zdejší čaroděj.
Sleduj mě na twitteru – @lukaschury.
survik1
~ Moderátor
0
Posthunter
8. 4. 2009   #5
-
0
-

To Curo : Jen tak pro zajímavost, kolik mb má aktuální tabulka na prog?

Nahlásit jako SPAM
IP: 89.102.156.–
Život je jen hra, která se nedá vyhrát.
marioff0
Expert
8. 4. 2009   #6
-
0
-

a mna by zaujimal cas spracovania v ms pri jednej kontrole jedneho prispevku.... :) ak budes taky dobry...

Nahlásit jako SPAM
IP: 195.78.44.–
Škoda, že život sa nedá "sejvovať", tak že by som po zlom životnom rozhodnutí mohol začať odznova :([br] Lenivosť je matka pokroku.[br][br] http://cut.sk/ - odstrihni si dlhý link
KIIV+42
God of flame
8. 4. 2009   #7
-
0
-

takze test:

tabulka:

CREATE TABLE `prectene` (

`user` bigint(20) NOT NULL,
`forum` bigint(20) NOT NULL,
`ts` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `user_2` (`user`,`forum`),
KEY `ts` (`ts`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


naplneni (perl):
use DBI;


$db = DBI->connect('DBI:mysql:test:localhost','login','heslo');
$i = 0;
while ( $i++ < 400 ) {
$j=0;
while ( $j++ < 10000 ) {
$db->do('insert delayed into prectene (user,forum) values ("'.$i.'","'.$j.'")');
}
print $i,' ',$j,"\n";
}


a otestovani:
use DBI;

use Time::HiRes qw(gettimeofday tv_interval);

$db = DBI->connect('DBI:mysql:test:localhost','login','heslo');
$x = $db->prepare('SELECT ts FROM prectene WHERE user = ? and forum = ?');


$i = 0; $cnt = 0;

$t0 = [gettimeofday];
while ( $i++ < 100000 ) {
$x->execute(int(rand()*500),int(rand()*10000));
if ( ($ts) = $x->fetchrow ) {
$cnt++;
}
}
$elapsed = tv_interval ( $t0, [gettimeofday]);

print "$cnt $elapsed\n";



vysledek na notebooku s indexem: (4000000 a neco zaznamu)
c:\perl>benchmark.pl
80202 19.625

tj. nalezeno 80202 polozek v tabulce ze 100000 hledani ... za celkovou dobu necelych 20 sekund
coz je 0.00019625 sekundy na jeden dotaz i nactenim ve scriptu..
nicmene nikde nevypisuju-- by to hodne zkreslilo vysledek

bez indexu:
still waiting (a to sem dal jen 1000 vyhledavani :DDDDD)

EDIT: tak sem se vykaslal na cekani ... nastavil sem 10 vyhledavani a vysledek nasledovnej:
nalezeno 6 z 10 (jako ze 4 v db vubec nejsou) a trvalo to 6.718s
tj. 0.6718s na jeden jedinej dotaz

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
marioff0
Expert
8. 4. 2009   #8
-
0
-

To KIIV : necakal by som tak dramaticky rozdiel bez a s indexami (ja som skusal nieco podobne pred nedavnom a nemal som az taky rozdiel).. dakujem za nazornu ukazku...

Nahlásit jako SPAM
IP: 195.78.44.–
Škoda, že život sa nedá "sejvovať", tak že by som po zlom životnom rozhodnutí mohol začať odznova :([br] Lenivosť je matka pokroku.[br][br] http://cut.sk/ - odstrihni si dlhý link
KIIV+42
God of flame
8. 4. 2009   #9
-
0
-

To marioff : tak kdyz je tam par stovek zaznamu tak to bez indexu jeste vladne...
ale kdyz uz je to 240MB soubor (z toho skoro tretina index :D) o 4 milionech radku tak uz je to zatracenej rozdil...
precijen bud projde vse nebo nic... mozna by to bylo jeste zajimavy dat s limit 1 ale to uz je jedno sem to zase promazl...
kazdopadne toto neni zase nejakej extremni procesor... obyc core duo pro notebook :)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Curo
~ Šéfredaktor
+8
Hero
9. 4. 2009   #10
-
0
-

To marioff : Díky indexům je to nepatrné při čtení vlákna (tedy příspěvků), nebo diskuze.
Nejhorší je to na HP fóra, kdy se to musí nasčítat.

Samozřejmě, dobré je cachovat, ale to je zase o něčem jiném, odpovídal jsem pouze na to, jak by mohla vypadat TAB pro přečtené.

To KIIV : Ty jsi testoval jen při uchovávání ID diskuze (asi, forum === ID diskuze předpokládám), pro lepší select a šetření výkonu je dobré uchovávat jak ID diskuze, tak vláken a samotných příspěvků (počet).

Nahlásit jako SPAM
IP: 83.240.25.–
Guitar Hero Master, Project führer & zdejší čaroděj.
Sleduj mě na twitteru – @lukaschury.
KIIV+42
God of flame
9. 4. 2009   #11
-
0
-

To Curo : no samo je to jen navrzeny trosku naivne.. tj ze si uchovam jen cas precteni a pak by se spocetlo kolik veci s novejsim casem je v tom vlaknu...
taky je to jen test na rychlost vyhledavani nad jednoduchou tabulkou...
jeste by tam bylo potreba to spocteni .. tj asi vytahnout nazvy a id vlaken, dalsim dotazem pak spojit prectene s prispevky a count(*) kdyz bude prispevek novejsi... pri otevreni vlakna pak update konkretniho klice uzivatel a forum (vlakno)

pocet prispevku neni spatnej napad, akorat jak delas, kdyz nekdo svuj prispevek smaze? update prectene set pocet = pocet-1 where forum = ... ?


Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
wise0
Stálý člen
9. 4. 2009   #12
-
0
-

Díky za názory, jenom pro doplnění.
To Curo : uživatel zjistí, zda-li jsou ve vláknu nové příspěvky až po přečtení vlákna, resp. při jeho otevření. Takže to chce udělat už v diskusi pro všechna vlákna. Ale to už je detail. Každopádně díky za pomoc, nějak takto jsem si to představoval, ale pořád mi to nedocházelo.

To KIIV : pěkná ukázka. trošku divočejší rozdíl :)

Nahlásit jako SPAM
IP: 81.25.16.–
"Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód..."
hrach
~ Redaktor
+1
Boss
9. 4. 2009   #13
-
0
-

To Curo : tento navrh je trošku špatne, jak už tu lehce zanělo, je lepší ukládat např. čas posledního přečtení vlákna, nebo lépe ještě id posledního připraveného příspěvku. pač kdybych ukládal jen počet, pak někdo smaže jeden post a hle... :)

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
wise0
Stálý člen
9. 4. 2009   #14
-
0
-

To hrach : jak to myslíš připraveného?

Nahlásit jako SPAM
IP: 81.25.16.–
"Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód..."
hrach
~ Redaktor
+1
Boss
9. 4. 2009   #15
-
0
-

To wise : omlouvám se, myslel sem přidaného :) na co to myslím?

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
wise0
Stálý člen
9. 4. 2009   #16
-
0
-

to nevim a radši nechci vědět :o) každopádně všem díky pánové za recepty :) určitě něco uvařím

Nahlásit jako SPAM
IP: 89.176.199.–
"Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód..."
Curo
~ Šéfredaktor
+8
Hero
10. 4. 2009   #17
-
0
-

To KIIV,hrach: ukládat ČAS u fóra a dle toho počítat (zobrazovat) nové příspěvky je brutální řešení, nepoužívat. To je právě to, čemu je třeba se vyhnout a to hned v základu.

Proto je potřeba počítat počet příspěvků. Ano, pokud někdo smaže svůj příspěvek, přepočítá se počet příspěvků, případně to přepočítá skript pouštěný BOTem (eventuelně CRONem).

To wise:

uživatel zjistí, zda-li jsou ve vláknu nové příspěvky až po přečtení vlákna, resp. při jeho otevření. Takže to chce udělat už v diskusi pro všechna vlákna.


Nikoliv. I na toto je myšleno (samozřejmě, je to základ). Díky tomu, že víme, o jaké vlákno se jedná, je to velmi jednoduché.

Uživatel ve vláknu s ID 111, když byl naposledy, mělo vlákno 12 příspěvků.

Při výpisu všech vláken se zeptáme na počet příspěvků, když tam byl uživatel naposledy. (Počet skutečných příspěvků ve vláknu máme samozřejmě cachované v tabulce u vlákna). Rozdíl mezi těmi hodnotami udává počet nových příspěvků.

Toto aplikujeme jak v přeheldu vláken, tak v přehledu příspěvků.

U přehledu diskuzí se počítá s cachováním (počet vláken a příspěvků, kontrola CRONEM nebo akci (vložení, mazání)).

Je třeba si uvědomit, že přidávání a mazání probíhá řádově méně častěji, než zobrazení. Proto řešit co nejvíce věcí hned při akcích.

"moje" řešení: u vlákna se sezptám na počet příspěvků, když tam byl čtenář naposledny (1 dotaz, 1 hodnota), rozdílem dostanu počet nových příspěvků.

"řešení dle data": u vlákna se dotážu na datum, kdy tam byl uživatel naposledy (1 dotaz, 1 hodnota), poté se zeptám, kolik příspěvků je nových dle toho, které jsou novější, než počet návštěv (1 dotaz, počet), rozdílem dostanu počet novch příspěvků.

Výsledek: v přehledu 25 vláken se provádí celkem 25 dotazů u každého vlákna, u data je to 50 dotazů.

PS: nejsem si jistý, jak byste dle data počítali počet nových příspěvků v diskuzích, nemáte-li možnost sečíst jednoduše příspěvky, které obsahuje zvolená diskuze.

Nevím jak vy, ale já nevidím ve vašem řešení dle data žádné výhody, je to jednodušší pro programátora, horší pro server, investora, který to celé platí, horší pro fórum a práci s daty.

Nahlásit jako SPAM
IP: 83.240.25.–
Guitar Hero Master, Project führer & zdejší čaroděj.
Sleduj mě na twitteru – @lukaschury.
Paja2
~ Moderátor
+2
Věrný člen
10. 4. 2009   #18
-
0
-

Když už jsme u tohoto tématu mohl by mi někdo poradit co mám na níže uvedeném kodu špatně




$diskuse=mysql_query("SELECT cat.nazev as tema,dp.reakce as reakce,dp.id as id,
us.nick as autor,us.jmeno as jmeno,prispevek,
DATE_FORMAT(datum,'%d.%m.%Y %H:%i:%s') as date
FROM prispevky as dp,
users as us,
category as cat
where (dp.id_autora=us.id and
cat.id=dp.id_diskuse and dp.id_diskuse='$tema')
$nove group by dp.id order by dp.datum DESC ") or die (mysql_error());

v get mám toto
if($_GET['zobrazit']=='nove') 

{
$nove="and dp.datum>us.lastlogin";

}

ale po kliknutí na odkaz kde mám &zobrazit=nove se mi nové příspěvky nezobrazí

Nahlásit jako SPAM
IP: 217.112.165.–
KIIV+42
God of flame
10. 4. 2009   #19
-
0
-

To Paja2 : a co vypsat nejaky hodnoty? treba ten last_login - treba si ho prepises nejakou prilis novou hodnotou (aktualni cas ci podobne a pak by musela byt uz docela haluz aby si neco ziskal), taky co ti to vypisuje bez te casove podminky?

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Paja2
~ Moderátor
+2
Věrný člen
10. 4. 2009   #20
-
0
-

To KIIV : Bez časové podmínky se vypíší všechny příspěvky, s časovou podmínkou jen nové příspěvky, které uživatel nepřečetl

Nahlásit jako SPAM
IP: 217.112.165.–
hrach
~ Redaktor
+1
Boss
10. 4. 2009   #21
-
0
-

to, co ted napisu, je kompletne z hlavy, bez testovani, zkusenosti, atp. ale teoreticky by to melo fungovat:
1 dotaz na 30 vlaken vcetne neprectenych postu v nich ...

select vlakna.*, count(posty.id) from vlakna

left join precteno on precteno.vlakno_id = vlakna.id and precteno.user_id = XXX
left join posty on posty.vlakno_id = vlakna.id and posty.posted_dt > precteno.dt
where vlakna.topic_id = XXX
group vlakna.id
limit 1, 30

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
KIIV+42
God of flame
10. 4. 2009   #22
-
0
-

To Paja2 : si napsal ze to nic nevypise ... pokud to funguje muzes ten test co sem zminoval klidne zapomenout

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Lordest0
Super člen
11. 4. 2009   #23
-
0
-

a co tak na to skusit pouzit COOKIE? kazda tema sa oznaci ako neprecitana a potom cez podmienku ak bude zalozene cookies v uzivatelskom PC o tom ze to precital tak sa mu zobrazi iny obrazok... mohlo by to fungovat.. cize napr.

if(!isset($_COOKIE['precitane_".$idtemy[0]."'])) {

echo "<img src='images/neprecitane.png' alt='Neprecitane' title='Neprecitane' />";
}else{
echo "<img src='images/precitane.png' alt='Precitane' title='Precitane' />";
}


mohlo by to fungovat.. samozrejme ta podmienka moze hodit chybu este som to neskusal, ale ak ti vyhodi chybu tak to treba stale skusat a davat do ineho tvaru.. skus sa s tym pohrat.. ako som povedal mohlo by to fungovat

btw. ak to uz niekto napisal tak sry necital som moc tuto diskusiu, iba prvy prispevok :D

Nahlásit jako SPAM
IP: 85.216.242.–
hrach
~ Redaktor
+1
Boss
11. 4. 2009   #24
-
0
-

nene, cookie ne; za prvne lidi migruji mezi pc, za druhe rozhodne ne pro kazde vlakno jednu cookie, za treti i ta cookie se muze ztratit- uzivatele cas od casu maji ve zvyku si sve cookie smazat - minimalne ja.

Nahlásit jako SPAM
IP: 90.179.27.–
http://jan.skrasek.com@hrachcz – webdeveloper
Lordest0
Super člen
11. 4. 2009   #25
-
0
-

hrach napsal:
nene, cookie ne; za prvne lidi migruji mezi pc, za druhe rozhodne ne pro kazde vlakno jednu cookie, za treti i ta cookie se muze ztratit- uzivatele cas od casu maji ve zvyku si sve cookie smazat - minimalne ja.

tjn, ale je to jedna z moznosti.. dalo by sa to urobit aj takto... to som tym myslel.. samozrejme je viac nevyhod nez vyhod..

Nahlásit jako SPAM
IP: 85.216.242.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý