[ del-boy @ 02.07.2003. 17:08 ] @
Kako da napravim sistem koji ce da proverava ko je online? Razmisljao sam da napravim posebnu tabelu u bazi u koji cu da stavim nick svakog novog clana ali onda ne znam kako da proverim da li je jos uvek aktivan.

Ako nisam krenuo dobrim putem, molim vas ispravite me...
[ bluesman @ 02.07.2003. 17:39 ] @
Proveravaj vreme pristupa. Moras za svaku stranu koju je pogledao da mu upises vreme kada je bio, pa odredis neki interval od recimo 15 minuta i kazes "korisnici online u poslednjih 15 minuta: ...". Ujedno pri svakom upisu brises starije od 15 minuta iz tvoje temp tabele.

temp_tabela:
username (ili id)
timestamp

i samo citas i pises ta 2 polja.
[ stanoje @ 02.07.2003. 17:59 ] @
mozes i da uradis svoje mysql funkcije za sesije pa da jednim udarcem ubijes
dve muve(imas u php-manualu primer) - ako budes radio evo saveta
za

function write ($id, $sess_data)
koristi REPLACE fju MySQL-a mnogo je elegantnija nego kombinacija
SELECT insert i update

nije je koristio ni onaj lik na:

http://www.cheetah-soft.com/csh/

mada je u pitanju dobar custom session handler. pogledaj obavezno
[ del-boy @ 02.07.2003. 18:38 ] @
Da, nisam se setio toga da svaki put proverim ko je "stariji" o 10 minuta...

Hvala...
[ Zoran Rašković @ 03.07.2003. 04:34 ] @
Samo da dodam, ovo je moguce odraditi i za standradne sajtove, gde nema registrovanih korisnika. Npr. mozes da izlistas sve razlicite ip adrese sa kojih su pristupili korisnici na tvoj sajt u recimo, poslednjih 5 minuta.

A prebrojavanjem razlicitih ip adresa u poslednjih 5 min dobijas, naravno, broj online posetilaca :)
[ del-boy @ 03.07.2003. 17:02 ] @
A kako to da uradim?

daj primer koda
[ bluesman @ 03.07.2003. 17:36 ] @
Opet ja i IP :-) Koga jednom zmija ujede ...

IP adrese su nepouzdane kao identifikacija... ali u ovom slucaju ipak moze da posluzi jer ti ne treba toliko striktno a i nista se ruzno nece desiti ako i pogresno ispises broj online korisnika.

Samo umestu username, cuvas u temp tabeli IP adrese i vreme pa opet radis iste provere samo ne radis sa username nego sa ip. Kao dodatak bih ti preporucio da koristis ip2long () [ili kako se vec zove funkcija] jer ona konvertuje IP adresu (string) u long format, a samim tim je i komparacija brza.
[ del-boy @ 03.07.2003. 17:47 ] @
Razmisljao sam o tome, ali mislim da cu njih koristiti samo za neregistrovane korisnike, a za registrovane ne vidim razlog zasto ne bih koristio user_name...

I jos samo, ako moze neko da mi odgovori:
Kako da u kuki stavim vreme u obliku TIMESTAMP radi lakseg poredjenja?
[ Vuk Nikolić @ 04.07.2003. 02:24 ] @
e ja sam to probao...ne mogu sad da se setim... probaj uz pomoc date naredbe... meni je radilo.


takodje sam u bazi napravio jednu tabelu gde se svaki "korisnik" upisuje prilikom posete as brise se svaki stariji od 5 minuta... za sad radi ok :D
[ bluesman @ 04.07.2003. 13:07 ] @
Citat:
del-boy:
I jos samo, ako moze neko da mi odgovori:
Kako da u kuki stavim vreme u obliku TIMESTAMP radi lakseg poredjenja?


Ne zezaj, pa mozes da pises bilo sta. Kada pises u cookie pisi:
setcookie("timestamp", time(), "koliko ti traje cookie", "",getenv("HTTP_HOST"));

Ne znam sta je ovde problem?
[ del-boy @ 04.07.2003. 16:57 ] @
Nisam dobro objasnio...

Ja uglavnom u bazi koristim TIMESTAMP i duzina mu je 14. E sada funkcija time() vraca ceo broj sa 10 cifara pa nisam mogao da ih uporedim, a posto sam vec napravio bazu, mrzelo me da menjam pa sam mislio da u kuki mogu da stavim ceo broj od 14 cifara za vreme...

Shvatas?

Ali sada nema veze, promenio sam bazu i sve je OK.
[ bluesman @ 05.07.2003. 16:51 ] @
Sada meni nije jasno? Timestamp je timestamp i bez obrzira da li je iz mysql ili php vraca uvek isti broj za isti datum. Ti mozes u mysql bazi da koristis obican INT UNSIGNED da bi cuvao timestamp polje jer je to upravo long int - sto dobijas i iz php. Sada sam i pogledao storage requirements u mysql i tamo lepo puse 4 bytes sto znaci long int unsigned, pa je i maksimalna vrednost timestamp upravo maksimalna vrednost koja moze da se upise u 4 bajta, pa je zato i timestamp ogranicen za merenje vremena do 2037 (ako se dobro secam)...
Zakljucak, ne mozes mi reci da iz mysql i php dobijas 2 razlicite vrednosti za timestamp!
[ del-boy @ 05.07.2003. 18:24 ] @
Ja ti nisam ni rekao da sam dobio razlicite vrednosti TIMESTAMPA u MySQLu i PHPu. Samo probaj da napravis u MySQL u nekoj tabeli polje TIMESTAMP i daj mu duzinu 14 i jos jedno sa duzinom 10. On ti vrati razlicite brojeve iako je to isto vreme. Ne znam zasto to...

Kada te brojeve izvlacis iz baze funkcijom date_format vrati istu vrednost tako da nema razlike.

Ako gresim, ispravi me, jer nisam ni ja siguran u ono sto pricam . Samo iznosim svoje zakljucke...

Pozdrav
[ tOwk @ 05.07.2003. 18:43 ] @
U MySQL-u polje TIMESTAMP se ne beleži u „Unix timestamp“ fazonu.

Unix timestamp je jedan neoznačeni ceo broj u 32 bita (kako bluesman već reče), i označava broj sekundi od 1. januara 1970. godine (takozvana „Unix epoha“).

MySQL beleži TIMESTAMP kao „GGGGMMDDČČMMSS“, pa je zato potrebno 14 mesta. Da bi obavio pretvaranje između dva zapisa, moraš da poznaješ osobine kalendara u kom se zapisuje datum u MySQL TIMESTAMP-u (Gregorijanski), ali najverovatnije i neka od funkcija u PHP-u nudi pretvaranje između datuma i Unix timestamp-a.
[ del-boy @ 05.07.2003. 18:55 ] @
Da i ja mislim da je tako samo nisam znao da to lepo objasnim.

E sada ono sto me je zbunilo je to da MySQL prihvata TIMESTAMP i sa 10 znakova i vraca vrednosti normalo kao i sa 14.

Kako to?
[ tOwk @ 05.07.2003. 19:17 ] @
MySQL u tom slučaju posmatra nenavedeno kao 0. Npr. ako navedeš samo 20030704, sat, minut i sekunde će biti 0. Ako navedeš 10 cifara, onda će samo minuti i sekunde biti 0. Takođe, ako za npr. mesec navedeš 14, onda će se dodati 1 na godinu, i mesec će biti 2=14-12.
[ CONFIQ @ 05.07.2003. 19:18 ] @
Zato što si očigledno napravio tabelu sa TIMESTAMP(14).

i da ubaciš samo jedan znak vratiće ti 14 ili ako ne ubaciš nijedan znak vratiće ti 14 :Đ (odnosno mysql automatski stavlja TIMESTAMP sa servera ako nisi naveo u INSERT-u)

Pogledaj ovde za više informacija.

~Say FiQ
[ del-boy @ 05.07.2003. 19:32 ] @
Da, znam da je dovoljno da samo unesem NULL u TIMESTAMP polje i on sam stavlja vrednost.

Nego mene zanima kako TIMESTAMP iz MySQLa mogu da pretvorim u broj sekundi Unix epohe. Treba mi da bih uporedio sa kukijem...

Imam par funkcija koje nesto muljaju sa kalendarom, pretvaraju ga iz jednog u drugi, a ja ne znam koju od njih treba koristiti.
[ popeye @ 06.07.2003. 03:15 ] @
Probaj ovo:

function mysql_timestamp_to_timestamp($dt) {
$yr=strval(substr($dt,0,4));
$mo=strval(substr($dt,4,2));
$da=strval(substr($dt,6,2));
$hr=strval(substr($dt,8,2));
$mi=strval(substr($dt,10,2));
$se=strval(substr($dt,10,2));

return mktime($hr,$mi,$se,$mo,$da,$yr);
}
[ -zombie- @ 06.07.2003. 03:25 ] @
najbolje da direktno mysql pitaš da konvertuje..

Code:

SELECT UNIX_TIMESTAMP(timestamp_kolona), * FROM tabela...

[ CONFIQ @ 06.07.2003. 03:30 ] @
Citat:
del-boy:
Nego mene zanima kako TIMESTAMP iz MySQLa mogu da pretvorim u broj sekundi Unix epohe. Treba mi da bih uporedio sa kukijem...

PHP::strtotime();
MySQL::unix_timestamp()



~Say FiQ
[ afwt @ 06.07.2003. 06:46 ] @
Digresija, predlog resenja za prvobitno pitanje:
Ako zelis da prikazujes broj registrovanih korisnika, najlakse ti je da napravis 'online' tabelu u MySQL-u, i da u nju upises posetioca kada se loguje (odmah iza, recimo, $_SESSION['username'] = $_POST['username']), a brises ga na Logout linku, tj. odmah iza session_destroy() funkcije. Onda samo sa SELECT COUNT(*) FROM 'online' vadis broj trenutno logovanih, i nisi ogranicen vremenskim limitom.

Naravno, ovo mozes koristiti samo u ovom specificnom slucaju.
[ del-boy @ 06.07.2003. 15:05 ] @
Citat:
-zombie-:
najbolje da direktno mysql pitaš da konvertuje..

Code:

SELECT UNIX_TIMESTAMP(timestamp_kolona), * FROM tabela...



ovo radi, ali posto to treba da uradi u while petlji i svaki put za drugu vrednost koju uzme iz baze dolazi do neke greske. Za svaki red vrati istu vrednost. Ako koristim strtotime onda vrati vrednost samo za prvi red a za ostale vraca -1.
[ del-boy @ 06.07.2003. 18:06 ] @
Uradio sam, ni sam ne znam kako ali je proradilo ono sa unix_timestamp.

Hvala svima...
[ Vuk Nikolić @ 07.07.2003. 19:42 ] @
e sad sam na sajtu phpfreaks.com i ima jedan tutorial za who's online... sad cu da ga pregledam :)